Укажите родительскую схему триггера в теле триггера. - PullRequest
0 голосов
/ 07 декабря 2011

В DB2 для IBM System i Я создаю этот триггер для записи на MYLOGTABLE каждую операцию вставки, выполненную на MYCHECKEDTABLE:

SET SCHEMA MYSCHEMA;

CREATE TRIGGER MYTRIGGER AFTER INSERT ON MYCHECKEDTABLE
REFERENCING NEW AS ROWREF
FOR EACH ROW BEGIN ATOMIC
     INSERT INTO MYLOGTABLE -- after creation becomes MYSCHEMA.MYLOGTABLE
         (MMACOD, OPTYPE, OPDATE)
     VALUES (ROWREF.ID, 'I', CURRENT TIMESTAMP);
END;

СУБД хранит тело триггера с жестким кодом MYSCHEMA.MYLOGTABLE.

Теперь представьте, что мы копируем всю схему как новую схему NEWSCHEMA. Когда я вставляю запись в NEWSCHEMA.MYCHECKEDTABLE, запись будет добавлена ​​в MYSCHEMA.MYLOGTABLE вместо NEWSCHEMA.MYLOGTABLE, т. Е. В схеме, где находятся триггер и его таблица. Это является причиной больших проблем! Кроме того, потому что многие пользователи могут копировать схему без моего контроля ...

Итак, есть ли способ указать в теле триггера схему, в которой находится триггер? Таким образом, мы запишем запись журнала в правильном MYLOGTABLE. Что-то вроде PARENT SCHEMA ... Или есть обходной путь ? Большое спасибо!

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

Внешние триггеры, определенные в HLL, имеют доступ к буферу триггеров, который включает имя библиотеки таблицы, которая сработала триггера. Это может быть использовано для уточнения ссылки на MYLOGTABLE.

Более подробную информацию смотрите в главе 11.2 "Структура программы запуска" IBM Redbook Хранимые процедуры, триггеры и пользовательские функции в DB2 Universal Database для iSeries .

В качестве альтернативы вы можете использовать специальный регистр CURRENT SCHEMA или оператор GET DESCRIPTOR, чтобы узнать, где в данный момент находятся триггер и / или таблица.

0 голосов
/ 20 декабря 2011

К сожалению, я понял, что схема, в которой живет триггер , не может быть обнаружена изнутри тела триггера.

Но есть некоторые обходные пути (благодаря @ krmilligan тоже):

  • Отнимите у пользователя полномочия на выполнение CPYLIB и заставьте его использовать утилиту.
  • Создайте в системе фоновый агент, который периодически выполняет поиск триггеров, которыене синхронизированы.
  • Для команды CPYLIB установите для параметра TRG по умолчанию значение *NO.Таким образом, триггеры никогда не будут скопированы, кроме случаев, когда пользователь явно указывает их.

Я выбрал последний, потому что он самый простой, даже если могут быть контексты, где требуется копирование триггера.В таких случаях я бы взял первый обходной путь.

...