假设用户 USER1 在多个表上创建了触发器,所有这些表都不属于该用户,但这些触发器将数据记录到 USER1 表中。
现在,如果我使用以下命令在 Oracle 中删除用户,这是否也会删除所有其他触发器?
SQL>drop 用户 USER 级联;
如果没有,触发器将无法工作,因为它们找不到要写入的目标表。此外,有没有办法删除数据库用户引发的所有触发器,而不管它们属于哪个模式?
一个简单的测试表明触发器将被丢弃。我创建了一个新用户TEST2
,授予它CREATE ANY TRIGGER
,然后创建了一个触发器PHIL.BIGTABLE
。
PHIL@PHILL11G2 > select count(*) from dba_triggers;
COUNT(*)
----------
617
PHIL@PHILL11G2 > drop user test2 cascade;
User dropped.
PHIL@PHILL11G2 > select count(*) from dba_triggers;
COUNT(*)
----------
616
PHIL@PHILL11G2 >
触发器元数据位于 DBA_TRIGGERS 中,因此删除它们是一个问题:
begin
for x in (
select owner,
trigger_name
from dba_triggers
where ... -- apply predicate to select triggers here)
loop
execute immediate 'drop trigger '||x.owner||'.'||x.trigger_name;
end loop;
end;
/