如果存在则删除触发器(ORACLE)

3

我想要在ORACLE中删除一个已经存在的触发器。

我知道在ORACLE中使用drop查询可以删除触发器。但我想知道如何检查该触发器是否已经存在于Oracle DB中。

DROP查询:

DROP TRIGGER **TRIGGER_NAME**

那是为什么呢?你不能直接执行查询吗?如果它不存在,它会抛出一个错误。如果存在,它将被删除。 - brenners1302
根据您的权限,无论您是否作为触发器的所有者登录,都可以查询[user|all|dba]_triggers。或者,您可以简单地删除触发器并捕获异常。 - Justin Cave
我是一名Delphi开发人员,正在从代码中创建此DROP查询。这就是我使用Oracle查询进行检查的原因。 - Pratik Soni
@brenners1302:我在我的电脑上没有安装ORACLE DB,所以请原谅我这个愚蠢的问题。我想知道如果我从代码端执行查询{DROP TRIGGER TRIGGER_NAME}并且它没有处理任何异常就抛出错误会怎么样?我需要做的就是无论如何删除触发器。我需要添加异常吗? - Pratik Soni
2个回答

9
您需要一个带有动态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'

-1

你有两个选项:

1)检查触发器是否存在

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

2) 删除触发器并检查异常


我在我的电脑上没有安装ORACLE DB,所以请原谅我这个愚蠢的问题。我想知道,如果我从代码端执行查询{DROP TRIGGER TRIGGER_NAME},并且它在不处理任何异常的情况下抛出错误,那该怎么办?我需要为此添加异常吗?无论如何,我都需要删除触发器。 - Pratik Soni
如果触发器不存在并且您删除它,会出现异常。因此,您只需要混淆异常,因为“无论如何都要删除触发器”:创建或替换触发器my_trg 在tmp上插入之前 对于每一行 开始 空; 结束;开始
  • 触发器仍然存在 执行立即'DROP TRIGGER my_trg';
  • 没有更多的触发器,引发异常 执行立即'DROP TRIGGER my_trg'; 例外 当其他人时 空; 结束;
- hinotf

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