Скремблирование данных для среды разработки после обновления, чтобы скрыть / замаскировать конфиденциальные данные - PullRequest
0 голосов
/ 19 февраля 2019

Я работаю над некоторыми сценариями для скремблирования данных из определенных столбцов.Я не очень хорошо разбираюсь в сценариях, но все же кое-как удалось написать код с помощью стека потока. Q & A
эта таблица имеет столбец xml, поэтому я хочу заменить данные из столбца 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;
/

1 Ответ

0 голосов
/ 19 февраля 2019

Вам нужно сделать execute immediate, если вы хотите сделать DML, используя динамическое имя таблицы в PL / SQL.Подстановочные строки (& 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 - попробуйте еще раз.

...