{"id":162,"date":"2017-11-24T22:11:25","date_gmt":"2017-11-24T21:11:25","guid":{"rendered":"http:\/\/wchmurze.cloud\/?p=162"},"modified":"2019-08-18T15:04:30","modified_gmt":"2019-08-18T13:04:30","slug":"wykrywanie-danych-osobowych-za-pomoca-t-sql-wersja-dla-ubogich","status":"publish","type":"post","link":"https:\/\/wchmurze.cloud\/index.php\/2017\/11\/24\/wykrywanie-danych-osobowych-za-pomoca-t-sql-wersja-dla-ubogich\/","title":{"rendered":"Wykrywanie danych osobowych za pomoc\u0105 T-sql &#8211; wersja dla ubogich"},"content":{"rendered":"<p>Nadchodzi nowa regulacja dotycz\u0105ca ochrony danych osobowych (RODO) termin wdro\u017cenia\u00a0 to maj 2018, nie ma wi\u0119c wiele czasu.<br \/>\nRegulacja wnosi wiele obostrze\u0144 w stosunku do obecnie dzia\u0142aj\u0105cych przepis\u00f3w, ale i tak prac\u0119 organiczn\u0105 nale\u017cy zacz\u0105\u0107 od analizy danych przechowywanych na naszych serwerach.<\/p>\n<p>Na rynku jest sporo gotowych i drogich narz\u0119dzi, kt\u00f3re potrafi\u0105 wykry\u0107 dane za pomoc\u0105 wbudowanych regu\u0142.<\/p>\n<p>Postanowi\u0142em si\u0119 zmierzy\u0107 z takim zadaniem wykorzystuj\u0105c kod t-sql i zbudowa\u0107 proste narz\u0119dzie do Data Discovery, a w\u0142a\u015bciwie jego pierwszy szkic.<\/p>\n<h2>Poni\u017cej znajdziesz propozycje implementacji niekt\u00f3rych zagadnie\u0144, kt\u00f3re przydadz\u0105 si\u0119 do budowy twojego w\u0142asnego rozwi\u0105zania.<\/h2>\n<p>&nbsp;<\/p>\n<h2>Za\u0142o\u017cenia<\/h2>\n<p>Narz\u0119dzie b\u0119dzie wymaga\u0107 instalacji dodatkowej bazy danych np. o nazwie RODO, na kt\u00f3rej umie\u015bcimy kod procedury sk\u0142adowanej, dedykowane tabele i s\u0142owniki.<\/p>\n<p>Kod pozosta\u0142ych na instancji baz nie powinien ulec zmianie.<\/p>\n<p>Budowa procedury sk\u0142adowanej na dedykowanej instancji serwera.<\/p>\n<p>Procedura pobiera list\u0119 tabel i kolumn tekstowych dla ca\u0142ej instancji serwera sql.<\/p>\n<p>Ograniczono list\u0119 kolumn do\u00a0 typ\u00f3w char, nchar, varchar, nvarchar.<\/p>\n<p>Dodatkowo dla ka\u017cdej z tabeli\u00a0 od\u0142o\u017cono liczb\u0119 rekord\u00f3w i aktualnie ustawiony seed dla p\u00f3l typu autonumer (identity)<\/p>\n<p>Procedura jest sterowana parametrem konfiguracyjnym w postaci XML-a.<\/p>\n<p>Dynamicznych sql pobierane s\u0105 poszczeg\u00f3lne kolumny danej tabeli . Tu mo\u017cna zastosowa\u0107 limit liczby rekord\u00f3w lub limit procentowy, np 5% ca\u0142o\u015bci.<\/p>\n<p>Po za\u0142adowaniu do dedykowanej tabeli danych z ca\u0142ej instancji proces rozpoczyna analiz\u0119 metadanych i danych.<\/p>\n<h3>Zastosowane algorytmy<\/h3>\n<p>a) nazewnictwo kolumn,<\/p>\n<p>zak\u0142adam na przyk\u0142ad , \u017ce pole char(11) lub varchar(11) o nazwie PESEL zawiera w sobie numer ewidencyjny<\/p>\n<p>b) wyra\u017cenia regularne<\/p>\n<p>Ze wzgl\u0119du na s\u0142abe wsparcie\u00a0 natywne z poziomu j\u0119zyka sql zastosowa\u0142em dedykowan\u0105 procedur\u0119 CLR.<\/p>\n<p>Bardzo efektywne do weryfikacji np. kodu pocztowego w postaci<\/p>\n<p>c) funkcje skalarne zwracaj\u0105ce warto\u015b\u0107\u00a0 1 (prawda) lub 0 (fa\u0142sz), parametrem wej\u015bciowym jest napis.<\/p>\n<p>Funkcje te mo\u017cna \u0142\u0105czy\u0107 wraz z wyra\u017ceniami regularnymi<\/p>\n<p>d) dedykowane s\u0142owniki<\/p>\n<p>Na pocz\u0105tek warto zacz\u0105\u0107 od s\u0142ownika imion i miejscowo\u015bci w Polsce.<\/p>\n<p>&nbsp;<\/p>\n<p>Kod przetestowano na instancji serwera sql 2012 w wersji developer.<\/p>\n<p>To z czym si\u0119 zmierzy\u0142em na pocz\u0105tku.<\/p>\n<h3>Pobranie listy tabel i kolumn tekstowych w obr\u0119bie serwera<\/h3>\n<p>Bazy mog\u0119 mie\u0107 r\u00f3\u017ane collation, wykorzysta\u0142em wymuszenie konwersji podczas operacji por\u00f3wnania<\/p>\n<pre class=\"sql\">COLLATE SQL_Latin1_General_CP1250_CI_AS<\/pre>\n<p>Bazy techniczne master,msdb,model i tempdb zosta\u0142y wykluczone<\/p>\n<p>Wykorzystano systemow\u0105 procedur\u0119 <strong>sp_MSforeachdb,<br \/>\n<\/strong>kt\u00f3ra jest wywo\u0142ywana dla ka\u017cdej bazy danych instancji serwera w taki spos\u00f3b, ze fragment dynamiczny kodu sql\u00a0 &#8216;?&#8217; jest zamieniany na nazw\u0119 bazy.<\/p>\n<p>&nbsp;<\/p>\n<pre lang=\"TSQL\">if object_id('tempdb..#DaneOsoboweTabele') is not null\r\n\r\n\r\nbegin\r\n\u00a0\u00a0 drop table\u00a0 #DaneOsoboweTabele\r\nend \u00a0\r\nbegin \r\nCREATE TABLE #DaneOsoboweTabele(\r\n\u00a0\u00a0 \u00a0[lp] [int] NULL,\r\n\u00a0\u00a0 \u00a0[ServerName] [varchar](128) COLLATE SQL_Latin1_General_CP1250_CI_AS NULL,\r\n\u00a0\u00a0 \u00a0[DataBaseName] [sysname] NOT NULL,\r\n\u00a0\u00a0 \u00a0[SchemaName] [sysname] NOT NULL,\r\n\u00a0\u00a0 \u00a0[NumberOfRows] [bigint] NULL,\r\n\u00a0\u00a0 \u00a0[TableName] [sysname] NOT NULL,\r\n\u00a0\u00a0 \u00a0[ColumnName] [sysname] NULL,\r\n\u00a0\u00a0 \u00a0[Typ] [nvarchar](141) COLLATE SQL_Latin1_General_CP1250_CI_AS NULL,\r\n\u00a0\u00a0 \u00a0[status] [int] NULL,\r\n\u00a0\u00a0 \u00a0[IdentityColumnName] [sysname] COLLATE SQL_Latin1_General_CP1250_CI_AS NULL,\r\n\u00a0\u00a0 \u00a0[IdentitySeed] [sql_variant]\u00a0\u00a0\u00a0 NULL,\r\n\u00a0\u00a0 \u00a0[IdentityIncrement] [sql_variant]\u00a0\u00a0 NULL,\r\n\u00a0\u00a0 \u00a0[IdentityValue] [sql_variant]\u00a0\u00a0\u00a0 NULL\r\n) \r\n\r\ncreate clustered index idx1 on #DaneOsoboweTabele([DataBaseName],[SchemaName],[TableName])\r\n\r\nend \r\n\r\ndeclare @tableSQL NVARCHAR(4000)\r\n\r\nSET @tableSQL ='\r\n\r\nselect \r\nROW_NUMBER() OVER(order by DB_NAME(),st.name,ss.name,sc.name) as lp,\r\n@@servername as ServerName,\r\n''?'' as DataBaseName,\r\nss.name as SchemaName,\r\nsum(pa.rows) as NumberOfRows,\r\nst.name as TableName,\r\nsc.name as ColumnName,\r\nsst.name+'' (''+convert(varchar(10),sc.max_length)+'')'' as Typ,\r\n0,\r\nIC.name AS IdentityColumnName,\r\nIC.seed_value as\u00a0 IdentitySeed,\r\nIC.increment_value AS IdentityIncrement, \r\nIC.last_value as IdentityValue\r\n\r\nfrom [?].sys.columns sc with (nolock)\r\njoin [?].sys.tables st with (nolock)\r\non (st.object_id=sc.object_id)\r\njoin [?].sys.systypes sst with (nolock)\r\non (sst.xtype=sc.system_type_id and sst.status=0)\r\njoin [?].sys.schemas ss with (nolock)\r\non (ss.schema_id=st.schema_id)\r\n\r\nINNER JOIN [?].sys.partitions pa with (nolock)\r\nON pa.OBJECT_ID = st.OBJECT_ID AND pa.index_id IN (1,0)\r\nleft join [?].sys.identity_columns IC with (nolock)\r\non (ic.object_id=st.object_id)\r\nwhere\r\nst.type=''U''\r\nand ''?'' not in (''model'',''master'',''tempdb'',''msdb'')\r\nand sst.xtype\u00a0 in (167,231,175,239) -- nchar, nvarchar, \r\nand not exists\r\n\r\n(\r\n\u00a0\u00a0 select 1\u00a0 from\u00a0\u00a0 #DaneOsoboweTabele baza with (nolock)\r\n\u00a0\u00a0 where baza.DataBaseName=''?''\r\n\u00a0\u00a0 and baza.SchemaName\u00a0 COLLATE SQL_Latin1_General_CP1250_CI_AS = ss.name\r\n\u00a0\u00a0 and baza.TableName\u00a0 COLLATE SQL_Latin1_General_CP1250_CI_AS =st.name\r\n\r\n)\r\n\r\nGROUP by\r\nss.name ,\r\nst.name,sc.name,sc.max_length,sc.system_type_id,sst.name,\r\n-- identity\r\nIC.name ,\r\nIC.seed_value,\r\nIC.increment_value ,\r\nIC.last_value\r\norder by ss.name,st.name,sc.name'\r\n\r\nSET NOCOUNT OFF\r\n\r\ninsert into\u00a0 #DaneOsoboweTabele\r\n(\r\n\u00a0\u00a0 \u00a0[lp], \r\n\u00a0\u00a0 \u00a0[ServerName], \r\n\u00a0\u00a0 \u00a0[DataBaseName], \r\n\u00a0\u00a0 \u00a0[SchemaName] ,\r\n\u00a0\u00a0 \u00a0[NumberOfRows], \r\n\u00a0\u00a0 \u00a0[TableName] ,\r\n\u00a0\u00a0 \u00a0[ColumnName],\r\n\u00a0\u00a0 \u00a0[Typ] ,\r\n\u00a0\u00a0 \u00a0[status], \r\n\u00a0\u00a0 \u00a0[IdentityColumnName],\r\n\u00a0\u00a0 \u00a0[IdentitySeed] ,\r\n\u00a0\u00a0 \u00a0[IdentityIncrement], \r\n\u00a0\u00a0 \u00a0[IdentityValue]\r\n)\r\n\r\n\r\nEXEC sp_MSforeachdb @tableSQL\r\n\r\n\r\n\r\nselect * from\u00a0 #DaneOsoboweTabele\r\norder by [ServerName], [DataBaseName], [SchemaName] ,[TableName] ,[ColumnName]\r\n\r\n\r\nNa ko\u0144cu procesu zapisujemy dane z tabeli tymczasowej do tabeli trwalej np\r\n\r\n<strong>DaneOsoboweTabele<\/strong>\r\n\r\nW tym miejscu mamy list\u0119 kolumn w tabelach z poszczegolnych baz banych, kt\u00f3re nalezy podda\u0107 analizie\r\n\r\n\r\n<\/pre>\n<h3>Sampling danych<\/h3>\n<p>Wykorzystano rozszerzenie t-sql\u00a0 znane od wersji 2005, czyli <strong>TABLESAMPLE<\/strong><\/p>\n<p>Przyk\u0142adowy kod na demonstracyjnej bazie danych<\/p>\n<pre lang=\"SQL\">use AdventureWorks2012\r\n-- wersja z liczb\u0105 rekord\u00f3w , pobieramy 1000 rekord\u00f3w losowo\r\nselect * from Person.Address TableSample( 1000 rows)\r\n-- wersja z procentem liczby rekord\u00f3w, pobieramy 1% losowo\r\nselect * from Person.Address TableSample( 1 percent)\r\n\r\n<\/pre>\n<p>Sapling danych zapisujemy do kolejnej tabeli trwa\u0142ej np.<\/p>\n<p>dbo.DaneOsoboweDane<\/p>\n<p>Czyli dla ka\u017cdego rekordu z\u00a0 DaneOsoboweTabele<\/p>\n<p>zapisujemy po kilkaset\/kilka tysi\u0119cy\/kilkana\u015bcie tysi\u0119cy rekord\u00f3w. Zale\u017cy to oczywi\u015bcie od liczby rekord\u00f3w w poszczeg\u00f3lnych tabelach<\/p>\n<p>Przyk\u0142adowy fragment kodu<\/p>\n<pre lang=\"SQL\">\tdeclare @id int\r\n\tdeclare @lp int\r\n\tdeclare @numberofRows bigint\r\n\tdeclare @databaseName varchar(255)\r\n\tdeclare @schemaName varchar(255)\r\n\tdeclare @tablename varchar(255)\r\n\tdeclare @columnname varchar(255)\r\n\tdeclare @identityColumnName varchar(255)\r\n\tdeclare @sql nvarchar(4000)\r\n\tdeclare @counter INT\r\n  \r\n  -- rekord do analizy\r\n  select top 1 @id=id, @numberofRows=numberofrows,@databaseName=databasename, @schemaName=schemaName,@tablename=tablename,@columnname=columnname,@identityColumnName=identityColumnName from  dbo.DaneOsoboweTabele  where status=0\r\n  order by id,lp,tablename,columnname\r\n\r\n  -- nie pozwalamy na przekroczenie liczby powyzej granicznej\r\n  if @numberofRows&gt;@limitsampli\r\n    set @numberofRows=@limitsampli\r\n  set @sql=' insert into dbo.DaneOsoboweDane (id,DataValue,ReverseDataValue) '\r\n  set @sql=@sql+' select top ( '+convert(varchar(20),@numberofRows)+' )  '+ str(@id)+' as id ,left(' +@columnname+',400)  as ' +@columnname+' , right(REVERSE('+@columnname+'),400) as ' +@columnname+' from '+@databasename+'.'+@schemaName+'.'+@tablename\r\n  set @sql=@sql+ ' TABLESAMPLE ( '+convert(varchar(20),@numberofRows)+' '+' ROWS) '\r\n\r\n  -- sprawdzamy czy nie ma juz danych w bazie dla danej kolumny danej tabeli  danego schematu i danej bazy\r\n  if not exists\r\n  (\r\n     select 1 from dbo.DaneOsoboweDane\r\n\t where id=@id and lp=@lp \r\n  )\r\n  begin \r\n    -- kody dynamicznego sql-a\r\n\texec sp_executesql  @sql\r\n  end\r\n<\/pre>\n<p>W tym momencie w tabeli DaneOsoboweDane mamy ju\u017c pr\u00f3bk\u0119 danych z ca\u0142\u0119j instancji serwera sql.<\/p>\n<p>Teraz to co nale\u017cy zrobi\u0107, to przeskanowa\u0107 ka\u017cd\u0105 grup\u0119 danych za pomoc\u0105\u00a0 np. wyra\u017ce\u0144 regularnych.<\/p>\n<h3>Wyra\u017cenie regularne<\/h3>\n<p>Przyk\u0142adowe regu\u0142y:<\/p>\n<p>Kod pocztowy:<\/p>\n<p>^\\d{2}-\\d{3}$<\/p>\n<p>Numer IP:<\/p>\n<p>^\\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0 -9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b$<\/p>\n<p>E-mail:<\/p>\n<p>^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Przyk\u0142adowe wywo\u0142anie procedury do wykrywania danych osobowych<\/p>\n<pre lang=\"xml\" escaped=\"true\">\r\n\r\ndeclare\u00a0 @KonFiguracjaXML xml\r\n\r\nset  @KonFiguracjaXML='<Konfiguracja>\r\n<Kolumny>\r\n\r\n<NazwaKolumny>abc<\/NazwaKolumny>\r\n<NazwaKolumny>imie<\/NazwaKolumny>\r\n<NazwaKolumny>nazwisko<\/NazwaKolumny>\r\n<NazwaKolumny>ulica<\/NazwaKolumny>\r\n<NazwaKolumny>kodpocztowy<\/NazwaKolumny>\r\n<NazwaKolumny>pesel<\/NazwaKolumny>\r\n<NazwaKolumny>nip<\/NazwaKolumny>\r\n<NazwaKolumny>regon<\/NazwaKolumny>\r\n<NazwaKolumny>adres<\/NazwaKolumny>\r\n<NazwaKolumny>miejscowosc<\/NazwaKolumny>\r\n<NazwaKolumny>poczta<\/NazwaKolumny>\r\n<\/Kolumny>\r\n\r\n<Regex>\r\n<Reg>\r\n<Id>2<\/Id>\r\n<Name>NIP<\/Name>\r\n<Formula>^(\\(d{3}-\\d{3}-\\d{2}-\\d{2})|(d{3}-\\d{2}-\\d{2}-\\d{3})$<\/Formula>\r\n<Priority>1<\/Priority>\r\n<\/Reg>\r\n\r\n<Reg>\r\n<Id>3<\/Id>\r\n<Name>PESEL<\/Name>\r\n<Formula>^\\d{11}$<\/Formula>\r\n<Priority>1<\/Priority>\r\n<\/Reg>\r\n\r\n<Reg>\r\n<Id>4<\/Id>\r\n<Name>REGON<\/Name>\r\n<Formula>^\\d{90}$<\/Formula>\r\n<Priority>1<\/Priority>\r\n<\/Reg>\r\n\r\n<Reg>\r\n<Id>5<\/Id>\r\n<Name>PostalCode<\/Name>\r\n<Formula>^\\d{2}-\\d{3}$<\/Formula>\r\n<Priority>1<\/Priority>\r\n<\/Reg>\r\n<Reg>\r\n<Id>6<\/Id>\r\n<Name>IPADDRESS<\/Name>\r\n<Formula>^\\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0 -9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b$<\/Formula>\r\n<Priority>1<\/Priority>\r\n<\/Reg>\r\n\r\n\r\n\r\n<Reg>\r\n<Id>8<\/Id>\r\n<Name>IBAN<\/Name>\r\n<Formula>^\\d{26}$<\/Formula>\r\n<Priority>0<\/Priority>\r\n<\/Reg>\r\n\r\n<Reg>\r\n<Id>9<\/Id>\r\n<Name>DOWOD1<\/Name>\r\n<Formula>^[A-Za-z]{3}\\d{6}$<\/Formula>\r\n<Priority>1<\/Priority>\r\n<\/Reg>\r\n\r\n<Reg>\r\n<Id>10<\/Id>\r\n<Name>DOWOD2<\/Name>\r\n<Formula>^[A-Za-z]{2}\\d{7}$<\/Formula>\r\n<Priority>1<\/Priority>\r\n<\/Reg>\r\n\r\n<Reg>\r\n<Id>11<\/Id>\r\n<Name>PolishCellularPhone<\/Name>\r\n<Formula>^\\+?[4][8]-?[0-9]{9}$<\/Formula>\r\n<Priority>0<\/Priority>\r\n<\/Reg>\r\n\r\n<Reg>\r\n<Id>12<\/Id>\r\n<Name>EMAIL<\/Name>\r\n<Formula>^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$<\/Formula>\r\n<Priority>0<\/Priority>\r\n<\/Reg>\r\n \r\n<Reg>\r\n<Id>13<\/Id>\r\n<Name>PHONE600<\/Name>\r\n<Formula>^60[0-9][0-9]{6}$<\/Formula>\r\n<Priority>0<\/Priority>\r\n<\/Reg>\r\n\r\n<Reg>\r\n<Id>14<\/Id>\r\n<Name>PHONE660<\/Name>\r\n<Formula>^66[0-5][0-9]{6}$<\/Formula>\r\n<Priority>0<\/Priority>\r\n<\/Reg>\r\n\r\n<Reg>\r\n<Id>15<\/Id>\r\n<Name>PHONE691<\/Name>\r\n<Formula>^69[1-8][0-9]{6}$<\/Formula>\r\n<Priority>0<\/Priority>\r\n<\/Reg>\r\n\r\n<Reg>\r\n<Id>16<\/Id>\r\n<Name>PHONE669<\/Name>\r\n<Formula>^66[7-9][0-9]{6}$<\/Formula>\r\n<Priority>0<\/Priority>\r\n<\/Reg>\r\n\r\n\r\n<\/Regex>\r\n\r\n\r\n<\/Konfiguracja>'\r\n\r\n\r\nexecute\u00a0\u00a0 dbo.spWyszukajDaneOsobowe \r\n@KonFiguracjaXML=@KonFiguracjaXML,\r\n@inDebug=1,\r\n@limitTabel =5000,\r\n@limitrekordow\u00a0 =10000,\r\n@limitsampli=2000,\r\n@limitprzetwarzania=5000,\r\n@tryb=0\r\n\r\n<\/pre>\n<p>Celem dzia\u0142ania procedury powinien by\u0107 raport, kt\u00f3ry poka\u017ce w kt\u00f3rej kolumnie danej tabeli znajduj\u0105 si\u0119<\/p>\n<p>dane spe\u0142niaj\u0105ca zastosowane wy\u017cej kryteria<\/p>\n<p>Przyk\u0142adowy raport z bazy \u00a0AdventureWorks2012:<\/p>\n<table width=\"900\">\n<tbody>\n<tr>\n<td width=\"157\">\n<pre>DataBaseName<\/pre>\n<\/td>\n<td width=\"101\">SchemaName<\/td>\n<td width=\"93\">TableName<\/td>\n<td width=\"92\">NumberOfRows<\/td>\n<td width=\"107\">ColumnName<\/td>\n<td width=\"218\">DataValue<\/td>\n<td width=\"358\">RuleName<\/td>\n<\/tr>\n<tr>\n<td>\n<pre>AdventureWorks2012<\/pre>\n<\/td>\n<td>Person<\/td>\n<td>EmailAddress<\/td>\n<td>19977<\/td>\n<td>EmailAddress<\/td>\n<td>miguel46@adventure-works.com<\/td>\n<td>EMAIL:^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>Krzysztof Pud\u0142owski<\/p>\n<p>Literatura:<\/p>\n<p><a href=\"https:\/\/www.mssqltips.com\/sqlservertip\/1414\/run-same-command-on-all-sql-server-databases-without-cursors\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/www.mssqltips.com\/sqlservertip\/1414\/run-same-command-on-all-sql-server-databases-without-cursors\/<\/a><\/p>\n<p><a href=\"https:\/\/www.mssqltips.com\/sqlservertip\/1308\/retrieving-random-data-from-sql-server-with-tablesample\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/www.mssqltips.com\/sqlservertip\/1308\/retrieving-random-data-from-sql-server-with-tablesample\/<\/a><\/p>\n<p><a href=\"https:\/\/technet.microsoft.com\/en-us\/library\/ff878119(v=sql.110).aspx\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/technet.microsoft.com\/en-us\/library\/ff878119(v=sql.110).aspx<\/a><\/p>\n<p><a href=\"https:\/\/github.com\/DevNambi\/sql-server-regex\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/github.com\/DevNambi\/sql-server-regex<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nadchodzi nowa regulacja dotycz\u0105ca ochrony danych osobowych (RODO) termin wdro\u017cenia\u00a0 to maj 2018, nie ma wi\u0119c wiele czasu. Regulacja wnosi wiele obostrze\u0144 w stosunku do obecnie dzia\u0142aj\u0105cych przepis\u00f3w, ale i tak prac\u0119 organiczn\u0105 nale\u017cy zacz\u0105\u0107 od analizy danych przechowywanych na &hellip; <a href=\"https:\/\/wchmurze.cloud\/index.php\/2017\/11\/24\/wykrywanie-danych-osobowych-za-pomoca-t-sql-wersja-dla-ubogich\/\">Continued<\/a><\/p>\n","protected":false},"author":1,"featured_media":1073,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[13,2],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.13 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Wykrywanie danych osobowych za pomoc\u0105 T-sql - wersja dla ubogich - W chmurze o chmurze i nie tylko<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/wchmurze.cloud\/index.php\/2017\/11\/24\/wykrywanie-danych-osobowych-za-pomoca-t-sql-wersja-dla-ubogich\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Wykrywanie danych osobowych za pomoc\u0105 T-sql - wersja dla ubogich - W chmurze o chmurze i nie tylko\" \/>\n<meta property=\"og:description\" content=\"Nadchodzi nowa regulacja dotycz\u0105ca ochrony danych osobowych (RODO) termin wdro\u017cenia\u00a0 to maj 2018, nie ma wi\u0119c wiele czasu. Regulacja wnosi wiele obostrze\u0144 w stosunku do obecnie dzia\u0142aj\u0105cych przepis\u00f3w, ale i tak prac\u0119 organiczn\u0105 nale\u017cy zacz\u0105\u0107 od analizy danych przechowywanych na &hellip; Continued\" \/>\n<meta property=\"og:url\" content=\"https:\/\/wchmurze.cloud\/index.php\/2017\/11\/24\/wykrywanie-danych-osobowych-za-pomoca-t-sql-wersja-dla-ubogich\/\" \/>\n<meta property=\"og:site_name\" content=\"W chmurze o chmurze i nie tylko\" \/>\n<meta property=\"article:published_time\" content=\"2017-11-24T21:11:25+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-08-18T13:04:30+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/wchmurze.cloud\/wp-content\/uploads\/2018\/04\/sql-glass.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"700\" \/>\n\t<meta property=\"og:image:height\" content=\"467\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"djkormo\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Napisane przez\" \/>\n\t<meta name=\"twitter:data1\" content=\"djkormo\" \/>\n\t<meta name=\"twitter:label2\" content=\"Szacowany czas czytania\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/wchmurze.cloud\/index.php\/2017\/11\/24\/wykrywanie-danych-osobowych-za-pomoca-t-sql-wersja-dla-ubogich\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/wchmurze.cloud\/index.php\/2017\/11\/24\/wykrywanie-danych-osobowych-za-pomoca-t-sql-wersja-dla-ubogich\/\"},\"author\":{\"name\":\"djkormo\",\"@id\":\"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323\"},\"headline\":\"Wykrywanie danych osobowych za pomoc\u0105 T-sql &#8211; wersja dla ubogich\",\"datePublished\":\"2017-11-24T21:11:25+00:00\",\"dateModified\":\"2019-08-18T13:04:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/wchmurze.cloud\/index.php\/2017\/11\/24\/wykrywanie-danych-osobowych-za-pomoca-t-sql-wersja-dla-ubogich\/\"},\"wordCount\":691,\"commentCount\":3,\"publisher\":{\"@id\":\"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323\"},\"articleSection\":[\"RODO\",\"t-sql\"],\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/wchmurze.cloud\/index.php\/2017\/11\/24\/wykrywanie-danych-osobowych-za-pomoca-t-sql-wersja-dla-ubogich\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/wchmurze.cloud\/index.php\/2017\/11\/24\/wykrywanie-danych-osobowych-za-pomoca-t-sql-wersja-dla-ubogich\/\",\"url\":\"https:\/\/wchmurze.cloud\/index.php\/2017\/11\/24\/wykrywanie-danych-osobowych-za-pomoca-t-sql-wersja-dla-ubogich\/\",\"name\":\"Wykrywanie danych osobowych za pomoc\u0105 T-sql - wersja dla ubogich - W chmurze o chmurze i nie tylko\",\"isPartOf\":{\"@id\":\"https:\/\/wchmurze.cloud\/#website\"},\"datePublished\":\"2017-11-24T21:11:25+00:00\",\"dateModified\":\"2019-08-18T13:04:30+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/wchmurze.cloud\/index.php\/2017\/11\/24\/wykrywanie-danych-osobowych-za-pomoca-t-sql-wersja-dla-ubogich\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/wchmurze.cloud\/index.php\/2017\/11\/24\/wykrywanie-danych-osobowych-za-pomoca-t-sql-wersja-dla-ubogich\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/wchmurze.cloud\/index.php\/2017\/11\/24\/wykrywanie-danych-osobowych-za-pomoca-t-sql-wersja-dla-ubogich\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/wchmurze.cloud\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Wykrywanie danych osobowych za pomoc\u0105 T-sql &#8211; wersja dla ubogich\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/wchmurze.cloud\/#website\",\"url\":\"https:\/\/wchmurze.cloud\/\",\"name\":\"W chmurze o chmurze i nie tylko\",\"description\":\"W chmurze o chmurze i nie tylko\",\"publisher\":{\"@id\":\"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/wchmurze.cloud\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pl-PL\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323\",\"name\":\"djkormo\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/wchmurze.cloud\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/14a901b808871fa98086ae259c45d646?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/14a901b808871fa98086ae259c45d646?s=96&d=mm&r=g\",\"caption\":\"djkormo\"},\"logo\":{\"@id\":\"https:\/\/wchmurze.cloud\/#\/schema\/person\/image\/\"},\"url\":\"https:\/\/wchmurze.cloud\/index.php\/author\/djkormo\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Wykrywanie danych osobowych za pomoc\u0105 T-sql - wersja dla ubogich - W chmurze o chmurze i nie tylko","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/wchmurze.cloud\/index.php\/2017\/11\/24\/wykrywanie-danych-osobowych-za-pomoca-t-sql-wersja-dla-ubogich\/","og_locale":"pl_PL","og_type":"article","og_title":"Wykrywanie danych osobowych za pomoc\u0105 T-sql - wersja dla ubogich - W chmurze o chmurze i nie tylko","og_description":"Nadchodzi nowa regulacja dotycz\u0105ca ochrony danych osobowych (RODO) termin wdro\u017cenia\u00a0 to maj 2018, nie ma wi\u0119c wiele czasu. Regulacja wnosi wiele obostrze\u0144 w stosunku do obecnie dzia\u0142aj\u0105cych przepis\u00f3w, ale i tak prac\u0119 organiczn\u0105 nale\u017cy zacz\u0105\u0107 od analizy danych przechowywanych na &hellip; Continued","og_url":"https:\/\/wchmurze.cloud\/index.php\/2017\/11\/24\/wykrywanie-danych-osobowych-za-pomoca-t-sql-wersja-dla-ubogich\/","og_site_name":"W chmurze o chmurze i nie tylko","article_published_time":"2017-11-24T21:11:25+00:00","article_modified_time":"2019-08-18T13:04:30+00:00","og_image":[{"width":700,"height":467,"url":"https:\/\/wchmurze.cloud\/wp-content\/uploads\/2018\/04\/sql-glass.jpg","type":"image\/jpeg"}],"author":"djkormo","twitter_card":"summary_large_image","twitter_misc":{"Napisane przez":"djkormo","Szacowany czas czytania":"7 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/wchmurze.cloud\/index.php\/2017\/11\/24\/wykrywanie-danych-osobowych-za-pomoca-t-sql-wersja-dla-ubogich\/#article","isPartOf":{"@id":"https:\/\/wchmurze.cloud\/index.php\/2017\/11\/24\/wykrywanie-danych-osobowych-za-pomoca-t-sql-wersja-dla-ubogich\/"},"author":{"name":"djkormo","@id":"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323"},"headline":"Wykrywanie danych osobowych za pomoc\u0105 T-sql &#8211; wersja dla ubogich","datePublished":"2017-11-24T21:11:25+00:00","dateModified":"2019-08-18T13:04:30+00:00","mainEntityOfPage":{"@id":"https:\/\/wchmurze.cloud\/index.php\/2017\/11\/24\/wykrywanie-danych-osobowych-za-pomoca-t-sql-wersja-dla-ubogich\/"},"wordCount":691,"commentCount":3,"publisher":{"@id":"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323"},"articleSection":["RODO","t-sql"],"inLanguage":"pl-PL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/wchmurze.cloud\/index.php\/2017\/11\/24\/wykrywanie-danych-osobowych-za-pomoca-t-sql-wersja-dla-ubogich\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/wchmurze.cloud\/index.php\/2017\/11\/24\/wykrywanie-danych-osobowych-za-pomoca-t-sql-wersja-dla-ubogich\/","url":"https:\/\/wchmurze.cloud\/index.php\/2017\/11\/24\/wykrywanie-danych-osobowych-za-pomoca-t-sql-wersja-dla-ubogich\/","name":"Wykrywanie danych osobowych za pomoc\u0105 T-sql - wersja dla ubogich - W chmurze o chmurze i nie tylko","isPartOf":{"@id":"https:\/\/wchmurze.cloud\/#website"},"datePublished":"2017-11-24T21:11:25+00:00","dateModified":"2019-08-18T13:04:30+00:00","breadcrumb":{"@id":"https:\/\/wchmurze.cloud\/index.php\/2017\/11\/24\/wykrywanie-danych-osobowych-za-pomoca-t-sql-wersja-dla-ubogich\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/wchmurze.cloud\/index.php\/2017\/11\/24\/wykrywanie-danych-osobowych-za-pomoca-t-sql-wersja-dla-ubogich\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/wchmurze.cloud\/index.php\/2017\/11\/24\/wykrywanie-danych-osobowych-za-pomoca-t-sql-wersja-dla-ubogich\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/wchmurze.cloud\/"},{"@type":"ListItem","position":2,"name":"Wykrywanie danych osobowych za pomoc\u0105 T-sql &#8211; wersja dla ubogich"}]},{"@type":"WebSite","@id":"https:\/\/wchmurze.cloud\/#website","url":"https:\/\/wchmurze.cloud\/","name":"W chmurze o chmurze i nie tylko","description":"W chmurze o chmurze i nie tylko","publisher":{"@id":"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/wchmurze.cloud\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pl-PL"},{"@type":["Person","Organization"],"@id":"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323","name":"djkormo","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/wchmurze.cloud\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/14a901b808871fa98086ae259c45d646?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/14a901b808871fa98086ae259c45d646?s=96&d=mm&r=g","caption":"djkormo"},"logo":{"@id":"https:\/\/wchmurze.cloud\/#\/schema\/person\/image\/"},"url":"https:\/\/wchmurze.cloud\/index.php\/author\/djkormo\/"}]}},"_links":{"self":[{"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/posts\/162"}],"collection":[{"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/comments?post=162"}],"version-history":[{"count":44,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/posts\/162\/revisions"}],"predecessor-version":[{"id":1074,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/posts\/162\/revisions\/1074"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/media\/1073"}],"wp:attachment":[{"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/media?parent=162"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/categories?post=162"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/tags?post=162"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}