我们的客户要求我们在从实时数据库导出数据之前随机化一些联系人数据。
我的计划是创建联系人表的副本,然后更新复制的表" FIRST_NAME"使用原始表格中的随机行,然后更新" LAST_NAME"使用原始表的不同随机行。
知道怎么做吗?仅供参考,它是一个oracle 10 db,我使用SQL开发人员来完成这项工作。
答案 0 :(得分:1)
我建议使用哈希函数:STANDARD_HASH
通过这种方式,数据变得匿名,但客户仍然可以使用数据并运行连接,分析等。
SELECT
RAWTOHEX(STANDARD_HASH('Wernfried', 'SHA1')) AS SHA1,
RAWTOHEX(STANDARD_HASH('Wernfried', 'SHA256')) AS SHA256,
RAWTOHEX(STANDARD_HASH('Wernfried', 'SHA384')) AS SHA384,
RAWTOHEX(STANDARD_HASH('Wernfried', 'SHA512')) AS SHA512,
RAWTOHEX(STANDARD_HASH('Wernfried', 'MD5')) AS MD5
FROM dual;
所以,像
UPDATE my_table SET
FIRST_NAME = RAWTOHEX(STANDARD_HASH('secretPrefix'||FIRST_NAME, 'MD5')),
LAST_NAME = RAWTOHEX(STANDARD_HASH('secretPrefix'||LAST_NAME, 'MD5'));
其中" my_table"当然是原始数据的副本。我设置了'secretPrefix'
,否则只需通过读取和散列电话目录中的所有名称来恢复哈希值就相当简单。
<强>更新强>
ALTER TABLE CONTACTS ADD (rn NUMBER);
UPDATE CONTACTS a SET rn = (SELECT RN FROM (SELECT ROW_NUMBER() OVER (ORDER BY DBMS_RANDOM.VALUE) AS RN, ROWID AS ROW_ID FROM CONTACTS b) WHERE a.rowid = ROW_ID);
UPDATE CONTACTS a SET (first_name, last_Name) = (
SELECT first_name, last_Name
FROM (SELECT first_name, last_Name, ROW_NUMBER() OVER (ORDER BY DBMS_RANDOM.VALUE) AS RN FROM ANONYMISED_NAMES) r WHERE r.RN = a.RN)
注意,对于此更新,随机名称的数量必须等于或大于实名表。否则,您可以使用MOD
功能。
答案 1 :(得分:0)
insert into NewTable(...., name, last_name)
select ...., n.name, l.last_name
from OldTable u,
(select count(distinct name) name_count, count(distinct last_name) last_name_count
from OldTable) c,
(select name, row_number() over(order by DBMS_RANDOM.value) as id
from (select distinct name from OldTable)
) n,
(select last_name, row_number() over(order by DBMS_RANDOM.value) as id
from (select distinct last_name from OldTable)
) l
where n.id=mod(u.ID, c.name_count)+1 and l.id=mod(u.ID, c.last_name_count)+1
u.ID
- 是源表的主键或其他唯一的“随机”整数值。