【发布时间】:2011-11-12 00:31:44
【问题描述】:
我可以在 oracle 存储过程中临时禁用触发器吗?
示例(伪代码):
MyProcedure{
disable MyTrigger;
//doStuff
enable MyTrigger;
};
【问题讨论】:
标签: oracle stored-procedures triggers
我可以在 oracle 存储过程中临时禁用触发器吗?
示例(伪代码):
MyProcedure{
disable MyTrigger;
//doStuff
enable MyTrigger;
};
【问题讨论】:
标签: oracle stored-procedures triggers
您可以使用 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 注入攻击。
【讨论】: