仅当存在时才触发 DROP (ORACLE) [重复]

Posted

技术标签:

【中文标题】仅当存在时才触发 DROP (ORACLE) [重复]【英文标题】:DROP trigger only if it exists (ORACLE) [duplicate] 【发布时间】: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 并且它抛出错误而不处理任何异常怎么办?我需要做的就是放下扳机。我需要为此添加例外吗? 【参考方案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'

【讨论】:

以上是关于仅当存在时才触发 DROP (ORACLE) [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Oracle Database 19c 技术架构

仅当两个连续的交叉点在同一方向时才触发信号

仅当未使用 @azure/msal-react 进行身份验证时才重定向 onLoad

仅当外键存在时才保存的标准方法是啥?

仅当它不存在时才在 SQLite 中创建表

仅当存在特定标头时才响应 Spring RepositoryRestResource