Verschleiern / Maske / Scramble persönlichen Informationen
Ich bin auf der Suche nach einheimischer Art zu klettern, Produktions-Daten für den Einsatz in Entwicklung und test. Ich habe gebaut, ein paar Skripts, die zufällig die soziale Sicherheit zahlen, shift Geburtsdaten, verschlüsselt E-Mails, etc. Aber ich habe auch gegen eine Wand versuchen zu klettern, Kunden-Namen. Ich will, dass real-Namen, so können wir noch verwenden, oder suchen, so dass zufällige Buchstaben-generation ist out. Was ich bisher versucht habe ist der Aufbau einer temp-Tabelle aller letzten Namen in der Tabelle dann aktualisieren Sie die Tabelle "Kunde" mit einer zufälligen Auswahl aus der temp-Tabelle. Wie diese:
DECLARE @Names TABLE (Id int IDENTITY(1,1),[Name] varchar(100))
/* Scramble the last names (randomly pick another last name) */
INSERT @Names SELECT LastName FROM Customer ORDER BY NEWID();
WITH [Customer ORDERED BY ROWID] AS
(SELECT ROW_NUMBER() OVER (ORDER BY NEWID()) AS ROWID, LastName FROM Customer)
UPDATE [Customer ORDERED BY ROWID] SET LastName=(SELECT [Name] FROM @Names WHERE ROWID=Id)
Dies funktionierte gut im test, aber komplett abbricht Umgang mit größeren Datenmengen (>20 Minuten für 40K Zeilen)
Alle, die Fragen, wie würden Sie krabbeln Kunden-Namen, während echte Namen und das Gewicht der Produktionsdaten?
UPDATE: Nie versagt, Sie versuchen, all die Informationen in der post, und Sie vergessen, etwas wichtiges. Diese Daten werden auch verwendet, in der unsere sales & demo-Umgebungen, die öffentlich zugänglich sind. Einige der Antworten sind das, was ich bin versucht zu tun, auf 'Schalter' den Namen, aber meine Frage ist, buchstäblich, wie Sie code in T-SQL?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Benutze ich generatedata. Es ist ein open-source-php-Skript erzeugt werden können alle Arten von dummy-Daten.
Eine sehr einfache Lösung wäre die ROT13-text.
Eine bessere Frage könnte sein, warum fühlen Sie die Notwendigkeit zum verschlüsseln der Daten? Wenn Sie einen Schlüssel für die Verschlüsselung, man könnte auch überlegen, läuft der text durch DES-oder AES oder ähnliches. Thos hätte jedoch potenzielle Leistungsprobleme.
Wenn es so etwas wie, dass ich in der Regel schreiben Sie ein kleines Programm, das erste lädt eine Menge von Namen und Vornamen in zwei arrays, und dann einfach die updates der Datenbank mit zufälligen Namen/Nachnamen von arrays. Es funktioniert wirklich schnell, auch für sehr große Datenmengen (200.000+ Datensätze)
Warum nicht einfach eine Art von Random Name Generator?
Arbeite ich auf diese in meinem Unternehmen gerade jetzt-und es stellt sich heraus, um eine sehr heikle Sache. Sie wollen die Namen haben, die realistisch sind, darf Sie aber nicht enthüllen keine echten persönlichen Daten.
Mein Ansatz wurde zunächst eine randomisierte "mapping" von letzten Namen anderen Nachnamen, dann verwenden Sie das mapping ändern alle Nachnamen. Das ist gut, wenn Sie die doppelten Namenseinträge. Angenommen, Sie haben 2 "John Smith" - Datensätze repräsentieren das gleiche Reale person. Wenn Sie änderungen an einem Datensatz zu "John Adams" und der andere "John Beste", dann ist Ihr eine "person" hat nun 2 verschiedene Namen! Mit einem mapping alle vorkommen von "Smith" geändert zu "Jones", und so Duplikate ( oder auch Familienmitglieder ) noch bis Ende mit dem gleichen Nachnamen, der Aufbewahrung der Daten "realistischer".
Werde ich auch zu klettern, die Adressen, Telefon-Nummern, Kontonummern, etc...und ich bin nicht sicher, wie ich diesen Ansatz. Das halten der Daten "realistisch", während scrambling ist sicherlich ein tiefes Thema. Dies muss getan worden, viele Male von vielen Unternehmen -- wer hat das schon gemacht? Was haben Sie gelernt?
Verwendung einer temporären Tabelle speichern und die Abfrage ist sehr schnell. Ich lief nur auf 60K Zeilen in 4 Sekunden. Ich werde dies ein für die Zukunft.
/* Vertausche die letzten Namen (nach dem Zufallsprinzip wählen Sie ein anderes Nachname) */
Den folgenden Ansatz für uns gearbeitet, können sagen, wir haben 2 Tabellen, Kunden und Produkte:
Der oben genannten Funktion wird helfen, erzeugen unterschiedliche Daten je nach Datentyp kommen.
Nun für jede Spalte in jeder Tabelle, die nicht über word "id" enthält, verwenden Sie folgende Abfrage generieren, die weitere Fragen zum Bearbeiten der Daten:
Beim ausführen der Abfrage erzeugen, aktualisieren, Abfragen zu jeder Tabelle und jeder Spalte der Tabelle, zum Beispiel:
Nun, wenn Sie ausführen, über Abfragen erhalten Sie Letzte update-Abfragen wird, aktualisieren Sie die Daten Ihrer Tabellen.
Führen Sie diese auf jedem SQL server-Datenbank, egal wie viele Tische hast du, es wird generieren von Abfragen für Sie, dass Sie weiter ausgeführt.
Hoffe, das hilft.
Einer anderen Website zu erzeugen, geprägt fake-Daten-sets, mit einer option für T-SQL-Ausgabe:
https://mockaroo.com/
Hier ist ein Weg, mit ROT47, die reversibel ist, und eine andere, die ist zufällig. Sie können eine PK, um entweder zu link zurück auf die "un-verschlüsselt" Versionen
Hatte das gleiche problem selber und dachte sich eine alternative Lösung, die möglicherweise für andere arbeiten.
Die Idee ist die Verwendung von MD5 auf den Namen und dann die letzten 3 hex-Ziffern für die Abbildung in einer Tabelle mit Namen. Dies können Sie separat für den vor-und Nachnamen.
3 hex-Ziffern darstellen Dezimalzahlen von 0 bis 4095, so brauchen wir eine Liste von 4096 Vornamen und 4096 Nachnamen.
So
conv(substr(md5(first_name), 3),16,10)
(inMySQL
syntax) wäre ein index von 0 bis 4095, dass könnte verbunden werden mit einer Tabelle, die hält 4096 Vornamen. Das gleiche Konzept angewendet werden konnte Nachnamen.Mithilfe von MD5 (im Gegensatz zu einer zufälligen Zahl) garantiert einen Namen in der ursprünglichen Daten wird immer zugeordnet werden, um die gleichen Namen in der test-Daten.
Können Sie eine Liste von Namen hier:
https://gist.github.com/elifiner/cc90fdd387449158829515782936a9a4
Verwende ich eine Methode, die Veränderungen Zeichen zu anderen Zeichen, die in der gleichen "Reihe" der Nutzungshäufigkeit in englischen Namen. Offenbar ist die Verteilung der Zeichen im Namen anders ist als es ist für den normalen Konversation Englisch. Zum Beispiel, "x" und "z" vorkommen, 0.245% der Zeit, so werden Sie vertauscht. Das andere extrem, "w" verwendet wird, 5.5% der Zeit, "s" 6.86% und "t", 15.978%. Ändere ich "s" auf "w", "t", "s" und "w" zu "t".
Ich halte die Vokale "aeio" in einer separaten Gruppe so, dass ein Vokal wird nur ersetzt durch einen anderen Vokal. Ebenso, "q", "u" und "y" werden nicht ersetzt, auf alle. Meine Gruppierung und Entscheidungen sind völlig subjektiv.
Landete ich mit 7 verschiedenen "Gruppen" von 2-5 Zeichen , meist basierend auf der Frequenz. Zeichen innerhalb jeder Gruppe sind vertauscht und mit anderen chars in der selben Gruppe.
Das Ergebnis ist, Namen, die ein bisschen Aussehen wie das sein könnte, Namen, aber von "nicht herum hier".
Hier ist die SQL, die ich verwenden, die enthält eine "TitleCase" - Funktion. Es gibt 2 verschiedene Versionen der "verwandelt" name basiert auf verschiedenen Frequenzen von Briefen, die ich im web gefunden.
Ehrlich gesagt, ich bin mir nicht sicher, warum dies erforderlich ist. Ihr dev/test-Umgebungen, privat, hinter Ihrer firewall und nicht zugänglich aus dem web.
Ihre Entwickler vertraut sein sollten, und Sie haben Sie rechtliche Handhabe gegen Sie, wenn Sie es versäumen, Ihrem Vertrauen gerecht werden.
Ich denke, die wirkliche Frage sollte sein "Sollte, vertausche ich die Daten?", und die Antwort ist (in meinen Augen) "Nein".
Wenn Sie es offsite-aus irgendeinem Grund, oder Sie haben Ihre Umgebungen, web-zugänglich sind, oder wenn Sie paranoid sind, würde ich implementieren einen random-Schalter. Eher als bauen Sie eine temporäre Tabelle ausführen, wechselt zwischen den einzelnen Orten und eine zufällige Zeile in der Tabelle, tauschen ein Stück von Daten zu einer Zeit.
Das Endergebnis ist eine Tabelle mit den gleichen Daten, aber mit es nach dem Zufallsprinzip neu geordnet. Es sollte auch schneller sein als dein temp-Tabelle, glaube ich.
Es sollte einfach genug für die Durchführung der Fisher-Yates-Shuffle in SQL...oder zumindest in einer console app, liest die db und schreibt an das Ziel.
Edit (2): Off-the-Manschette Antwort in T-SQL:
declare @name varchar(50)
set @name = (SELECT lastName from person where personID = (random-id-Nummer)
Update Personen
set Nachname = @name
WHERE personID = (person-id der aktuellen Zeile)
Wickeln Sie diese in einer Schleife, und Folgen Sie den Richtlinien des Fisher-Yates-zum ändern der zufällige Wert-constraints, und Sie werden eingestellt werden.