【问题标题】:Scrambling the data for dev environment after refresh to hide/mask the sensitive data刷新后为开发环境打乱数据以隐藏/屏蔽敏感数据
【发布时间】:2019-07-13 08:57:59
【问题描述】:

我正在编写一些脚本来打乱特定列中的数据。我在脚本编写方面不是很好,但仍然有一些如何在 stackflow Q&A 的帮助下编写代码
这个表有 xml 列,所以我想用 Field Position 替换 xml 列中的数据,所以有时应该用随机 varchar 替换,有时用同一个表中的其他值替换,具体取决于要求。

下面是表结构:

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;
/

【问题讨论】:

  • 嗨,欢迎来到 StackOverflow。你的问题到底是什么?您使用的是什么编程语言(或者只是 sql?)请编辑并标记问题以涵盖这些要点;添加您想要的输出示例;并添加您的源代码,解释您遇到的问题。谢谢。

标签: sql xml oracle scramble updatexml


【解决方案1】:

如果您想在 PL/SQL 中使用动态表名执行某些 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 查询 - 再试一次。

【讨论】:

  • 声明表名 VARCHAR2(255) := 'ACCOUNT'; FIELD_POSITION VARCHAR2(255) := 'c2'; BEGIN 立即执行“更新”||表名 || ' 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******* PL/SQL 过程成功完成。 15:01:06 > 提交;提交完成。但是当我选择该列时,它仍然显示相同的旧值..没有更新
  • @vancouver_dba - 我编辑了我的答案,看看是否有帮助。
猜你喜欢
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
  • 1970-01-01
相关资源
最近更新 更多