Доступ к старым значениям без :СТАРЫЙ и в триггере

#oracle #plsql #triggers #collation

Вопрос:

Как обсуждалось здесь, я не могу использовать :OLD и :NEW для столбцов с параметрами, отличными от USING_NLS_COMP. Я пытаюсь найти способ обойти это, но пока безуспешно.

Что я могу сделать, так это получить доступ к новым строкам с помощью составного триггера, сохраняя идентификаторы измененных строк ПОСЛЕ КАЖДОЙ СТРОКИ, а затем зацикливаясь на них и выбирая строки в ИНСТРУКЦИИ AFTER. К сожалению, то же самое не относится к старым ценностям.

Вот пример того, что не работает:

 CREATE TABLE example_table (
  id VARCHAR2(10),
  name NVARCHAR2(100)
);
CREATE TABLE log_table (
  id VARCHAR2(10),
  new_name NVARCHAR2(100),
  old_name NVARCHAR2(100)
);

CREATE OR REPLACE TRIGGER example_trigger
AFTER UPDATE ON example_table
FOR EACH ROW BEGIN
  INSERT INTO log_table VALUES(:old.id, :new.name, :old.name);
END;

INSERT INTO example_table VALUES('01', 'Daniel');
-- this works as expected
UPDATE example_table SET name = ' John' WHERE id = '01';
SELECT * FROM log_table;

DROP TABLE example_table;

CREATE TABLE example_table (
  id VARCHAR2(10),
  -- this is the problematic part
  name NVARCHAR2(100) COLLATE XCZECH_PUNCTUATION_CI
);

INSERT INTO example_table VALUES('01', 'Daniel');
-- here nothing is inserted into log_example, if you try to
-- recompile the trigger you'll get error PLS-00049
UPDATE example_table SET name = ' John' WHERE id = '01';
SELECT * FROM log_table;

DROP TABLE example_table;
DROP TABLE log_table;
DROP TRIGGER example_trigger;
 

Если у кого-то есть решение для этого, я был бы весьма признателен.

Комментарии:

1. Вы воссоздали триггер после воссоздания таблицы? Это не похоже на ваш сценарий, кроме комментария о PLS-00049.