我可以在Oracle存储过程中暂时禁用触发器吗?
例如(伪代码):
MyProcedure{
disable MyTrigger;
//doStuff
enable MyTrigger;
};
我可以在Oracle存储过程中暂时禁用触发器吗?
例如(伪代码):
MyProcedure{
disable MyTrigger;
//doStuff
enable MyTrigger;
};
您可以使用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注入攻击。