SQL Server'da veri karışıklığı


43

SQL Server'da Veri Toplama için en iyi yöntem nedir?

UAT sistemimizde maskeli Üretim verisini kullanmak istiyoruz.

Çabucak ve daha yüksek düzeyde bir engellemeyle yapmak istiyorsak, hangi yaklaşım izlenmeli? İnsanların verdikleri isim ve soyadı için karakter karıştırmayı düşünüyorum, ama nasıl? Kendim bir işlev mi oluşturmalıyım yoksa kullanılabilecek önceden tanımlanmış bir işlev var mı? Tekerleği yeniden icat etmekle zaman geçirmek istemiyorum :)

Tarih alanlarına ne dersiniz? Örneğin doğum tarihi tüm tablodan rastgele seçilmeli ve bir kayda atanmalı mı, yoksa bunu yapmanın daha iyi bir yolu var mı?

Yanıtlar:


25

Keşke bunu düşündüğün için sana 100 puan kazandırabilseydim! Bu konunun pek çok kez gözden kaçırıldığını gördüm, bu doğru değildi - çok iyi. Anladığım kadarıyla siz aslında alanların içindeki verileri karıştırmak istiyorsunuz ve ne elde etmeye çalıştığınızı anlasam da, bunun için tam olarak gerekli olmayabilir - buna rağmen durum bazında düşünülmelidir.

Çoğu veri koruma kanunu, örneğin bir doğum tarihi veya telefon numarası gibi bir veri parçasını bir bireyle doğru şekilde ilişkilendirme yeteneği etrafında döner. Verilerinizi üretimden çıkıp UAT'ye taşıdığınızda asıl kişiyle kolayca eşleştirilmemesini - özellikle de ad ve soyadını karıştırdığınızda - karıştırılmasını sağlayarak yasanın gereklerini yerine getirebilirsiniz.

Ancak bu, örneğin iletişim bilgileri diyelim meseleye değinmiyor. Verileri karıştırıp kanunun gerekliliklerini yerine getirebilirsiniz ancak telefon numaraları hala gerçektir, e-postalar hala gerçektir vb ... sadece doğru kişiye atanmamışlardır. Bunun için, UAT'a aktarmadan önce bu verilerin silinmesi durumunda, Red Gate , sizin için rasgele test verileri oluşturabilen, böylece alanları test edilebilecek verilerle yeniden doldurabilmeniz için Veri Üreticisi adlı bir yazılım parçası yapmasını öneririm .

Veri karıştırmaya gelince: Bunu sizin için yapan birçok uygulama var ve dürüst olmak gerekirse, tekerleği yeniden icat etmek istememekte haklısınız. Şirketimizde kullandığımız ürün Net2000 adlı bir şirketin Data Masker adlı ürünüdür. Lisans oldukça ucuz, son derece hızlı çalışıyor ve veritabanını karıştırmadan önce tüm kısıtlamalarınızı devre dışı bırakmaktan endişelenmenize gerek yok.

Gereksinimlerinizi karşılayan bir şey bulamazsanız elbette kendi çözümünüzü kullanabilirsiniz - bunu yapmaya karar verirseniz, saf TSQL'den çok daha esnek olduğundan CLR prosedürlerini kullanmanızı şiddetle tavsiye ederim (siz değilsiniz) TSQL kullanamazsınız burada bakınız ).

Bunu gerçekleştirmek için bir uygulama seçtikten sonra, karar vermeniz gereken bir sonraki şey aslında karıştırmak istediğiniz / karıştırmanız gereken şey nedir? Dürüst olmak gerekirse, bunun için en iyi kaynağınız şirket hukuk ekibiniz ve şirket denetçilerinizdir. Bazen onlarla çalışmaktan hoşlanmayabileceğimizi biliyorum ama kendi başlarına yapmak ve kendi başlarına yapmaya çalışmak yerine onlara soruyu sormak için size daha iyi davranacaklar, yardım istemekle ilgili kesinlikle yanlış bir şey yok. - özellikle de bu kadar önemli olduğunda.

Umarım bu size yardımcı olur ve arayışınızda size iyi şanslar diliyorum ... ;-)


1
Yapabilseydim, şirket politikasından bahsetmek için ek bir yer işareti verirdim.
dezso

Yasal gereklilikler paydaşlar tarafından belirlenir. Şimdi uygulamalıyım.
Gökyüzü

Bay Bownstone, açıklamanız her zamanki gibi mükemmel. Teşekkür ederim. Bunun için CLR fonksiyonunu kontrol edeceğim ve T-SQL'de de bir göz atacağım. Hangisinin daha iyi uyduğunu ve daha hızlı inşa edildiğini görün.
Gökyüzü

10

Bay Brownstone kafasına çiviyi vurdu. Şimdi size biraz yardım etmek için, işte dizelerimi gizlemek için kullanılan "garble" fonksiyonum (isimlerle komik sonuçlar!). Bir dizgeden geç, bozuk bir dizge döndürür. Dize sütunlarına karşı güncelleme ifadelerine ekleyin. Veri uzunluğunu uygun gördüğünüz şekilde değiştirin.

---------------------
-- Garble Function --
---------------------
-- Make a function to slightly garble the strings
IF (object_id('fn_Garble') is not null)
  drop function fn_Garble
go
create function fn_Garble
(
  @String varchar(255)
)  
returns varchar(255)
as
BEGIN
  select @String = replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(@String,'o','e'),'a','o'),'i','a'),'u','i'),'t','p'),'c','k'),'d','th'),'ee','e'),'oo','or'),'ll','ski')
  return @String
END
go

3
Tanıdık geliyor? (Sadece bir nokta gösterimidir.) O bir SQL Server thBo eppowo konotho için. bir kekik böre Meprepelas kek ve Waph SQL kullandı. Thopobose kensilponps pe voraeis piblak on pravope sekper ergonazopaens ürününü önlüyoruz. bir SQL Server’da bulunan bir SQL Server’da bulunan Mogozan ’’-101 101 101 101 101 101 101 101 101------ Bir SQL Server ile SQL Server'ın her ikisini de kurar.
dezso

1
heh ... onu tanımak biraz zaman aldı. Orada bir sürü karışık olmayan kelime var. Sadece ilk isimlere, soyadlarına, şehir isimlerine karşı kullandım. Sadece saçma bir işlev. Kariyerimi bu konuda riske atmam.
datagod,

Yaklaşımı takdir ediyorum - basit ama çalışıyorum. Artı, metnin hala okunaklı olması. Yine de anlayamadım :)
dezso 6:12

7

Müşterilerimin perakende satış verileri için bunu yapmak zorunda kaldım. Nüfus sayımına gittim ve tüm ilk ve soyadı indirdiğim isimler için, her sonuncuya ilk önce katılmak için döngüden geçirdim, her seks kodunu ekledim ve büyük harflerle bir masaya yerleştirdim. Daha sonra yaklaşık 400 milyon benzersiz isimle bir masam vardı. Mevcut verilerimiz büyük harf olmadığından büyük harf kullandım, böylece temizlenen verileri daha kolay anlatabildim.

Kullanıcı verilerimi temizlediğimde isimleri değiştirdim, doğum günü için herkesi doğdukları yılın 1 Ocak'ına koydum ve herhangi bir telefon numarasını posta koduyla güncelledim (verilerim yalnızca ABD’di). E-posta adresleri firs ilk artı soyadı @ mycompany.co oldu. Posta adresi bana en fazla üzüntüyü verdi, ancak şehri değiştirdim, eyaleti ve fermuarı kullandım çünkü adres değiştirilirse sorun olmadıklarına inanıyorum. Bozuk mektuplar üreten ve bununla adres satırını güncelleyen bir programı olan bir iş arkadaşım vardı.

Herhangi bir yerde yinelenen verilerim vardı ama yine de ana kullanıcıya bir FK vardı (kötü tasarım evet, ama benim değil) Bu veriyi de güncelledim, böylece ad x kullanıcısı için veritabanı boyunca tutarlıydı.

Genel olarak verilerim hala okunabilirdi, ancak adres anlamlı gelmedi. Tüm bu çalışmaları elde etmek birkaç günümü aldı, ancak bir kez yapıldıktan sonra bir sql aracı işi oluşturulduktan sonra, verileri 15 dakika kadar kısa bir sürede temizleyebildim.


Yaklaşımını beğendim. Verilen ad ve soyadı ile ilgili olarak, eğer veri seti yeterince büyükse, iyi bir çeşitlilik seviyesine sahipse, nüfus sayımı web sitesinden isim indirmek yerine, kaynak olarak kullanabiliriz. Verileri SELECT DISTICT ile sorgulamak, bize oynamamız gereken pek çok benzersiz değeri söyleyecektir.
Gökyüzü

0

Tek bir alanı gizlemek için HASHBYTES işlevini kullanmaya ne dersiniz (SQL 2008+ de)? Verilerinizi tuzlamanız koşuluyla algoritmanızı (MD5 muhtemelen yeterlidir) seçebilirsiniz. Öyleyse sadece SELECT HASHBYTES('SHA2_256', <LAST NAME FIELD>) yaptığınızdan emin olun SELECT HASHBYTES('SHA2_256', <LAST NAME FIELD> + '<my salt string>')ve şimdi kolayca zorla kullanılamayan bir karmaşanız var.

Desteklenebilir, tekrarlanabilir ve muhtemelen çok daha hızlı olan gerçek bir işlevdir. Sadece gizlemeye karşı gerçekten güvenli bir şekilde ne kadar güvenceye ihtiyacınız olduğuna bağlı olarak, daha zayıf ve daha hızlı bir karma kullanabilirsiniz.


MD5'i bu gün ve yaşta kullanmamalısınız, doğası gereği güvensiz.
Philᵀᴹ

Tamam ... İşte HASHBYTES ile seçimleriniz: MD2 | MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512 Herkes için bir şeyler! (evet, kullanmamanız gerekenler dahil). Öyleyse SHA2_512'yi kullanıyoruz ... bu yaklaşımla ilgili başka herhangi bir sorun var mı?
cmcapellan

-1

Chrissy Lemaire (@ chrissy-lemaire) ve ekibi tarafından yazılmış Statik Veri Maskesi için ücretsiz bir seçenek olan dbatools PowerShell modülüne bir göz atın. Tüm aletleri harika, bu yüzden bakmaya değer olduğuna eminim.

Dbatools içinde aramak için iki komut şunlardır: New-DbaDbMaskingConfig Invoke-DbaDbDataMasking

Bunu bildiren blog yazısına bir göz atın: otomatik veri maskeleme


2
Link sadece cevaplar çok yardımcı değil. Cmdlet'lerin nasıl kullanılacağına dair örnekler vererek cevabınızı artırabilirsiniz.
Erik Darling
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.