我们需要打乱某些表上的某些字段值,但某些字段之间存在逻辑链接。
例如,如果表是:table t(name varchar2(30), email varchar2(60)),则 email 值必须以名称的完整值开头:
Name Email
---- ----
Smith Smitha@any.com
所以打乱之后可以
Name Email
---- ----
xubal xubaly@any.com
我们使用 dbms_random.string 函数,因此每次调用它都会返回一个不同的值。
是否可以在一次独特的运行中进行更新并保持字段之间的逻辑链接?(我不能使用数据库触发器)
在接下来我尝试的两个选项中,Oracle 返回名称字段的旧值而不是新值。
update t
set name=dbms_random.string('l',length(name)),
email=name || dbms_random.string('l',2) || '@any.com';
update t t1
set name=dbms_random.string('l',length(name)),
email=(select t1.name || dbms_random.string('l',2) || '@any.com'
from t t2
where t2.rowid = t1.rowid)