仅当存在时才触发 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) [重复]的主要内容,如果未能解决你的问题,请参考以下文章