2015-12-08 36 views
2

我要丢失ORACLE中的现有触发器。只有在DROP触发器存在的情况下(ORACLE)

我知道drop查询触发器oracle。但想知道如何检查该触发器是否已存在于Oracle DB中。

DROP查询:

DROP TRIGGER **TRIGGER_NAME** 
+0

这是什么原因?您不能执行查询,如果它不存在则会抛出一个错误。如果它存在,它将被丢弃。 – brenners1302

+0

您可以根据您的特权查询'[user | all | dba] _triggers',无论您是否以触发器的所有者身份登录等。或者您可以简单地删除触发器并捕获异常。 –

+0

我是一个** delphi **开发人员,我从代码创建了这个** DROP **查询。所以这是我用** oracle query **来检查它的原因。 –

回答

-1

你有两个选择:

1)检查触发存在

SELECT * 
    FROM user_triggers 
WHERE trigger_name = '...' 

2)跌落触发和检查异常

+0

我的机器上没有安装ORACLE DB。所以原谅我这个蹩脚的问题。我想知道,如果从代码端执行查询{DROP TRIGGER TRIGGER_NAME},它会抛出错误而不处理任何异常?所有我需要做的就是放弃扳机。我需要为此添加例外吗? –

+0

如果触发器不存在并且您放弃它,则会出现异常。因此,您只需要混淆异常,导致'无论如何丢弃触发':创建或替换触发器my_trg 之前为每行插入tmp 开始 null; 结束; BEGIN - 触发器仍然存在 立即执行'DROP TRIGGER my_trg'; - 不再触发,异常提出 立即执行'DROP TRIGGER my_trg'; EXCEPTION 何时其他 NULL; END; – hinotf

2

您需要一个具有动态SQL的PL/SQL块:

-- drop the trigger if it exists 
declare 
    l_count integer; 
begin 

    select count(*) 
    into l_count 
    from user_triggers 
    where trigger_name = 'TRIGGER_NAME'; 

    if l_count > 0 then 
    execute immediate 'drop trigger trigger_name'; 
    end if; 

end; 
/


-- now create the trigger  
create trigger trigger_name 
    .. 
begin 
end; 
/

注意(无引号)标识符被存储在上壳体在Oracle系统目录。因此,请确保在PL/SQL检查中使用trigger_name = 'TRIGGER_NAME'而不是trigger_name = 'trigger_name'

相关问题