我能帮您翻译成中文:我可以在 Oracle 存储过程中临时禁用触发器吗?

8

我可以在Oracle存储过程中暂时禁用触发器吗?

例如(伪代码):

MyProcedure{

    disable MyTrigger;
    
    //doStuff
    
    enable MyTrigger;

};
1个回答

16

您可以使用EXECUTE IMMEDIATE语法通过动态SQL发出DDL语句,例如"ALTER TRIGGER"语句。

这里有一个描述: 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;

如果您喜欢,也可以使用VARCHAR变量构建动态SQL:

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注入攻击。


11
请注意:Alter触发器是DDL类型的,会提交事务。 - Florin Ghita

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接