【问题标题】:DROP trigger only if it exists (ORACLE) [duplicate]仅当存在时才触发 DROP (ORACLE) [重复]
【发布时间】:2016-03-13 02:38:11
【问题描述】:

我想删除 ORACLE 中的现有触发器。

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

删除查询:

DROP TRIGGER **TRIGGER_NAME**

【问题讨论】:

  • 这是什么原因?你不能只执行查询,如果它不存在就会抛出错误。如果存在,它将被丢弃。
  • 您可以根据您的权限查询[user|all|dba]_triggers,您是否以触发器的所有者身份登录等。或者您可以简单地删除触发器并捕获异常。
  • 我是一个 delphi 开发人员,我正在从代码中创建这个 DROP 查询。所以这就是我使用 oracle 查询 进行检查的原因。
  • @brenners1302:我的机器上没有安装 ORACLE DB。所以请原谅我这个蹩脚的问题。我想知道如果我从代码端执行查询 {DROP TRIGGER TRIGGER_NAME} 并且它抛出错误而不处理任何异常怎么办?我需要做的就是放下扳机。我需要为此添加例外吗?

标签: oracle oracle11g triggers


【解决方案1】:

你有两个选择:

1) 检查触发器是否存在

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

2) DROP 触发器并检查异常

【讨论】:

  • 我的机器上没有安装 ORACLE DB。所以请原谅我这个蹩脚的问题。我想知道如果从代码端执行查询 {DROP TRIGGER TRIGGER_NAME} 并且它抛出错误而不处理任何异常怎么办?我需要做的就是放下触发器。我需要为此添加例外吗?
  • 如果触发器不存在并且您将其删除,则会出现异常。因此,您只需要混淆异常,导致“无论如何都删除触发器”:在每行插入 tmp 之前创建或替换触发器 my_trg 开始为空;结尾; BEGIN -- 触发器仍然存在执行立即'DROP TRIGGER my_trg'; -- 不再触发,引发异常执行立即'DROP TRIGGER my_trg';其他人为空时的例外情况;结束;
【解决方案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'

【讨论】:

    猜你喜欢
    • 2012-09-23
    • 2013-04-28
    • 1970-01-01
    • 2021-04-30
    • 2014-03-22
    • 2020-09-11
    • 2011-09-11
    • 1970-01-01
    • 2013-05-03
    相关资源
    最近更新 更多