刷新到 hide/mask 敏感数据后,为开发环境加扰数据
Scrambling the data for dev environment after refresh to hide/mask the sensitive data
我正在编写一些脚本来扰乱特定列中的数据。我不太擅长编写脚本,但在 stackflow Q&A
的帮助下如何设法编写代码
这个 table 有 xml 列,所以我想用 Field Position 替换 xml 列中的数据,所以有时应该用随机 varchar 替换,有时用相同 [=21] 中的其他值替换=] ,取决于要求。
下面是table结构:
select * from USER.ACCOUNT;
ID XML
-------------------- --------------------------------------------------
10043210281964 <row id="10043210281964" xml:space="preserve"><c1>
11365650</c1><c2>6970</c2><c3>
CAD1460801480110 <row id="CAD1460801480110" xml:space="preserve"><c
2>14600</c2><c3>AAAAAAAA/W
GBP1405608560123 <row id="GBP1405608560123" xml:space="preserve"><c
2>14056</c2><c3>AAAAAAAL<
10181005424866 <row id="10181005424866" xml:space="preserve"><c1>
588764</c1><c2>6970</c2><c3>AAAAA
10232000152850 <row id="10232000152850" xml:space="preserve"><c1>
23152850</c1><c2>6010</c2><c3>
10013200079509 <row id="10013200079509" xml:space="preserve"><c1>
890006</c1><c2>6970</c2><c3>AAAAA
10100618109100 <row id="10100618109100" xml:space="preserve"><c1>
11877032</c1><c2>6970</c2><c3>
10033200519959 <row id="10033200519959" xml:space="preserve"><c1>
11215154</c1><c2>6970</c2><c3>
10100614571766 <row id="10100614571766" xml:space="preserve"><c1>
181616</c1><c2>6304</c2><c3>AAAA
CAD1405606040116 <row id="CAD1405606040116" xml:space="preserve"><c
2>14056</c2><c3>AAAAAAAAAAA<
我正在尝试编写的脚本无法正常工作,缺少某些东西...
DECLARE
TABLENAME VARCHAR2(255);
FIELD_POSITION VARCHAR2(255);
BEGIN
update &TABLENAME T1 set T1.xmlrecord = updatexml(T1.xmlrecord,'/&TABLENAME/row/preserve[position()=&FIELD_POSITION]/text()', dbms_random.string('A',10) );
DBMS_OUTPUT.PUT_LINE(CHR(10)||'*******COLUMN UPDATED AS REQUESTED*******');
END;
/
如果您想在 PL/SQL 中使用动态 table 名称执行某些 DML,则需要执行 execute immediate
。替换字符串 (&TABLENAME) 不会改变它。
DECLARE
TABLENAME VARCHAR2(255) := 'ACCOUNT';
FIELD_POSITION VARCHAR2(255) := 'c2';
BEGIN
execute immediate 'update ' || TABLENAME || ' T1 set T1.xmlrecord = updatexml(T1.xmlrecord,''/row/' || FIELD_POSITION || '/text()'', dbms_random.string(''A'',10) )';
DBMS_OUTPUT.PUT_LINE(CHR(10)||'*******COLUMN UPDATED AS REQUESTED*******');
END;
/
编辑:哦,你的 Xpath 查询是错误的。它不匹配任何内容,因此 updatexml
不会替换 xml 中的任何内容。您只需要 /row/c2/text()
而不是 /ACCOUNT/row/preserve[position()=c2]/text()
。例如看这个:
-- sample data
with t1 as (select xmltype('<row id="10043210281964" xml:space="preserve"><c1>11365650</c1><c2>6970</c2><c3>AAAAAAAA</c3></row>') as xmlrecord from dual)
select
updatexml(T1.xmlrecord,'/ACCOUNT/row/preserve[position()=c2]/text()', dbms_random.string('A',10) ) first_way,
updatexml(T1.xmlrecord,'/row/c2/text()', dbms_random.string('A',10) ) second_way
from t1;
我更新了上面的 pl/sql 块以获得有效的 xpath 查询 - 再试一次。
我正在编写一些脚本来扰乱特定列中的数据。我不太擅长编写脚本,但在 stackflow Q&A
的帮助下如何设法编写代码
这个 table 有 xml 列,所以我想用 Field Position 替换 xml 列中的数据,所以有时应该用随机 varchar 替换,有时用相同 [=21] 中的其他值替换=] ,取决于要求。
下面是table结构:
select * from USER.ACCOUNT;
ID XML
-------------------- --------------------------------------------------
10043210281964 <row id="10043210281964" xml:space="preserve"><c1>
11365650</c1><c2>6970</c2><c3>
CAD1460801480110 <row id="CAD1460801480110" xml:space="preserve"><c
2>14600</c2><c3>AAAAAAAA/W
GBP1405608560123 <row id="GBP1405608560123" xml:space="preserve"><c
2>14056</c2><c3>AAAAAAAL<
10181005424866 <row id="10181005424866" xml:space="preserve"><c1>
588764</c1><c2>6970</c2><c3>AAAAA
10232000152850 <row id="10232000152850" xml:space="preserve"><c1>
23152850</c1><c2>6010</c2><c3>
10013200079509 <row id="10013200079509" xml:space="preserve"><c1>
890006</c1><c2>6970</c2><c3>AAAAA
10100618109100 <row id="10100618109100" xml:space="preserve"><c1>
11877032</c1><c2>6970</c2><c3>
10033200519959 <row id="10033200519959" xml:space="preserve"><c1>
11215154</c1><c2>6970</c2><c3>
10100614571766 <row id="10100614571766" xml:space="preserve"><c1>
181616</c1><c2>6304</c2><c3>AAAA
CAD1405606040116 <row id="CAD1405606040116" xml:space="preserve"><c
2>14056</c2><c3>AAAAAAAAAAA<
我正在尝试编写的脚本无法正常工作,缺少某些东西...
DECLARE
TABLENAME VARCHAR2(255);
FIELD_POSITION VARCHAR2(255);
BEGIN
update &TABLENAME T1 set T1.xmlrecord = updatexml(T1.xmlrecord,'/&TABLENAME/row/preserve[position()=&FIELD_POSITION]/text()', dbms_random.string('A',10) );
DBMS_OUTPUT.PUT_LINE(CHR(10)||'*******COLUMN UPDATED AS REQUESTED*******');
END;
/
如果您想在 PL/SQL 中使用动态 table 名称执行某些 DML,则需要执行 execute immediate
。替换字符串 (&TABLENAME) 不会改变它。
DECLARE
TABLENAME VARCHAR2(255) := 'ACCOUNT';
FIELD_POSITION VARCHAR2(255) := 'c2';
BEGIN
execute immediate 'update ' || TABLENAME || ' T1 set T1.xmlrecord = updatexml(T1.xmlrecord,''/row/' || FIELD_POSITION || '/text()'', dbms_random.string(''A'',10) )';
DBMS_OUTPUT.PUT_LINE(CHR(10)||'*******COLUMN UPDATED AS REQUESTED*******');
END;
/
编辑:哦,你的 Xpath 查询是错误的。它不匹配任何内容,因此 updatexml
不会替换 xml 中的任何内容。您只需要 /row/c2/text()
而不是 /ACCOUNT/row/preserve[position()=c2]/text()
。例如看这个:
-- sample data
with t1 as (select xmltype('<row id="10043210281964" xml:space="preserve"><c1>11365650</c1><c2>6970</c2><c3>AAAAAAAA</c3></row>') as xmlrecord from dual)
select
updatexml(T1.xmlrecord,'/ACCOUNT/row/preserve[position()=c2]/text()', dbms_random.string('A',10) ) first_way,
updatexml(T1.xmlrecord,'/row/c2/text()', dbms_random.string('A',10) ) second_way
from t1;
我更新了上面的 pl/sql 块以获得有效的 xpath 查询 - 再试一次。