Можно ли временно отключить триггер в хранимой процедуре Oracle? - PullRequest
7 голосов
/ 07 сентября 2011

Можно ли временно отключить триггер в хранимой процедуре Oracle?

пример (псевдокод):

MyProcedure{

    disable MyTrigger;

    //doStuff

    enable MyTrigger;

};

спасибо заранее. Giuseppe

1 Ответ

12 голосов
/ 07 сентября 2011

Вы можете выдавать DDL, такие как операторы ALTER TRIGGER, через динамический SQL, используя синтаксис EXECUTE IMMEDIATE.

Описание этого здесь: http://download.oracle.com/docs/cd/B12037_01/appdev.101/b10807/13_elems017.htm

PROCEDURE myProcedure
IS
BEGIN
   EXECUTE IMMEDIATE 'ALTER TRIGGER triggername DISABLE';

   -- Do work

   EXECUTE IMMEDIATE 'ALTER TRIGGER triggername ENABLE';
EXCEPTION
   WHEN OTHERS
   THEN
      -- Handle Exceptions
END myProcedure;

Вы можетепостройте динамический SQL, используя переменную VARCHAR, если вам нравится:

PROCEDURE myProcedure
IS
   v_triggername VARCHAR2(30) := 'triggername';
BEGIN
   EXECUTE IMMEDIATE 'ALTER TRIGGER '||v_triggername||' DISABLE';

   -- Do work

   EXECUTE IMMEDIATE 'ALTER TRIGGER '||v_triggername||' ENABLE';
EXCEPTION
   WHEN OTHERS
   THEN
      -- Handle Exceptions
END myProcedure;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...