我在SQL Server中有一系列表格,我想更改敏感数据,例如患者姓名和社会安全号码,而不删除然后重新插入全新的行。我只是想改变“识别”信息。
我购买了Red-Gate SQL数据生成器,希望它可以完成这项工作,但事实并非如此。它坚持删除现有行,然后插入新的混淆数据。我想保留表之间的关系(即保留主键和外键)。有没有办法改变/更新现有数据,同时仍保持测试和开发的可读性?
答案 0 :(得分:1)
我尝试使用随机数上的自联接更新表格的想法,并提出以下内容:
DECLARE @PatientData TABLE (ID INT IDENTITY(1,1), PatientName VARCHAR(100), PatientBill DECIMAL(10,2))
INSERT INTO @PatientData (PatientName, PatientBill) -- this will be our unchanging data
SELECT 'Andrew', 100.00
UNION
SELECT 'James', 456.00
UNION
SELECT 'John', 782.00
UNION
SELECT 'Jill', 456.00
UNION
SELECT 'Jack', 157.00
UNION
SELECT 'Julie', 9.00
UNION
SELECT 'Jesse', 75.00
UNION
SELECT 'Jackson', 4563.00
UNION
SELECT 'Johnson', 7783.00
UNION
SELECT 'Jeremy', 9841.00
UNION
SELECT 'Jeff', 4565.00
UNION
SELECT 'Jamie', 75387.00
UNION
SELECT 'Jillian', 86786.00
DECLARE @ScrambledData TABLE (ID INT, PatientName VARCHAR(100), PatientBill DECIMAL(10,2)) -- this one will get scrambled
INSERT INTO @ScrambledData (ID, PatientName, PatientBill)
SELECT ID, PatientName, PatientBill
FROM @PatientData
UPDATE sd
SET sd.PatientName = pd.PatientName
FROM
@ScrambledData sd
INNER JOIN
(
SELECT
ROW_NUMBER() OVER (ORDER BY NEWID()) ID,
PatientName,
PatientBill
FROM @PatientData
) pd ON
sd.ID = pd.ID
UPDATE sd
SET sd.PatientBill = pd.PatientBill
FROM
@ScrambledData sd
INNER JOIN
(
SELECT
ROW_NUMBER() OVER (ORDER BY NEWID()) ID,
PatientName,
PatientBill
FROM @PatientData
) pd ON
sd.ID = pd.ID
SELECT *
FROM
@PatientData pd
INNER JOIN
@ScrambledData sd ON
pd.ID = sd.ID
在你的例子中,当然,你正在做一个自我JOIN,但我想使用这两个表,以便我可以确认它是否正常工作。我故意发布了两个UPDATE语句,因此您不太可能将患者姓名与其实际账单相关联,但您可以使用单个UPDATE语句执行相同的操作来执行几个不同的JOIN。
你也可以运行这个语句几次,以便对数据进行双重哈希:我认为这是一个好主意,虽然我不能确定在多次执行中保持相同的几率(如果我'正确地思考,100行数据集在一次执行中有1%的机会保持相同,然后在两次执行中保持相同的1:1,000的机会。但是,你也有机会回到记录它曾经是,我认为也是1:1,000?任何更好地掌握统计概率和更高咖啡因水平的人都知道一个可靠的答案吗?)