Шифрование данных для среды разработки после обновления, чтобы скрыть/маскировать конфиденциальные данные

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

person vancouver_dba    schedule 19.02.2019    source источник
comment
Привет, добро пожаловать в StackOverflow. В чем именно заключается ваш вопрос? И какой язык программирования вы используете (или это только sql?). Пожалуйста, отредактируйте и пометьте вопрос, чтобы охватить эти моменты; добавьте пример желаемого результата; а также добавьте актуальный исходный код, объяснив, где вы застряли. Спасибо.   -  person MandyShaw    schedule 20.02.2019


Ответы (1)


Вам нужно сделать 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 - попробуйте еще раз.

person kfinity    schedule 19.02.2019
comment
DECLARE TABLENAME 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 (''А'',10) )'; DBMS_OUTPUT.PUT_LINE(CHR(10)||'********СТОЛБЦ ОБНОВЛЕН ПО ЗАПРОСУ********'); КОНЕЦ; / *******СТОЛБЦ ОБНОВЛЕН ПО ЗАПРОСУ******* Процедура PL/SQL успешно завершена. 15:01:06 › совершить; Фиксация завершена. но когда я выбираю столбец, он по-прежнему показывает те же старые значения... ничего не обновляется - person vancouver_dba; 20.02.2019
comment
@vancouver_dba - я отредактировал свой ответ, посмотрим, поможет ли это. - person kfinity; 20.02.2019