我们需要在 Oracle 10g 数据库中屏蔽一些个人身份信息。我正在使用的过程基于我们用于 Sybase 的另一个屏蔽脚本(工作正常),但由于 Oracle 和 Sybase 数据库中的信息完全不同,我遇到了一些障碍。
该过程是从 PERSON 表中选择所有数据,放入 PERSON_TRANSFER 表中。然后我们使用一个随机数从 PERSON_TRANSFER 表中选择一个随机名称,然后使用该随机名称更新 PERSON 表。这在 Sybase 中运行良好,因为 PERSON 表中每个人只有一行。
我遇到的问题是,在 Oracle DB 中,每个 PERSON 有多行,每行的名称可能不同,也可能不同,例如
|PERSON|
:-----------------:
|PERSON_ID|SURNAME|
|1 |Purple |
|1 |Purple |
|1 |Pink | <--
|2 |Gray |
|2 |Blue | <--
|3 |Black |
|3 |Black |
PERSON_TRANSFER 是该表的副本。该表有数百万行,所以我在这里只给出一个非常基本的例子:)
我当前使用的逻辑只会将所有行更新为与该 PERSON_ID 相同,例如
|PERSON|
:-----------------:
|PERSON_ID|SURNAME|
|1 |Brown |
|1 |Brown |
|1 |Brown | <--
|2 |White |
|2 |White | <--
|3 |Red |
|3 |Red |
但这是不正确的,因为该 PERSON_ID 的不同名称需要以不同方式屏蔽,例如
|PERSON|
:-----------------:
|PERSON_ID|SURNAME|
|1 |Brown |
|1 |Brown |
|1 |Yellow | <--
|2 |White |
|2 |Green | <--
|3 |Red |
|3 |Red |
如何让脚本分别更新不同的名称,而不是仅仅根据 PERSON_ID 更新它们?我的脚本目前看起来像这样
DECLARE
v_SURNAME VARCHAR2(30);
BEGIN
select pt.SURNAME
into v_SURNAME
from PERSON_TRANSFER pt
where pt.PERSON_ID = (SELECT PERSON_ID FROM
( SELECT PERSON_ID FROM PERSON_TRANSFER
ORDER BY dbms_random.value )
WHERE rownum = 1);
END;
这会导致错误,因为该随机 PERSON_ID 返回的行太多。
1) 是否有更有效的方法来更新 PERSON 表以便随机分配名称?2) 我如何确保正确屏蔽 PERSON 表,因为对于任何单个 PERSON_ID,各种姓氏都保持不同(或相同,如果它们都相同)?
我希望这是足够的信息。我已经将它简化了一点(该表有更多的列,例如名字、出生日期、TFN 等),希望它使解释更容易。
任何输入/建议/帮助将不胜感激:)
谢谢。