删除表时,依赖触发器会发生什么?

时间:2013-04-02 18:11:57

标签: oracle triggers drop-table

我有一个表backup,我在其上应用了一个触发器upd_trig。现在,我放弃了我的表,然后检查了所有关联的触发器/索引是否也将被丢弃或将保留在那里。

当我发现一些讨论here时,他们说Trigger / Index都将被删除,一旦我们放弃我们的表。但是,似乎触发器仍然存在。当我们放弃表格时,任何人都可以解释,到底发生了什么?

SQL> drop table backup;

Table dropped.

SQL> select text from user_source;

TEXT
----------------------------------------------------------------------------------------------------
TRIGGER
"BIN$Dg5j/bf6Rq6ugyN5ELwQkw==$0" BEFORE UPDATE ON backup FOR EACH ROW
BEGIN
INSERT INTO BACKUP VALUES(USER,:OLD.ENAME,SYSDATE);
END;

9 rows selected.

SQL> select count(*) from user_triggers;

  COUNT(*)
----------
         1

SQL> select trigger_name from user_triggers;

TRIGGER_NAME
------------------------------
BIN$Dg5j/bf6Rq6ugyN5ELwQkw==$0

1 个答案:

答案 0 :(得分:5)

该表已被删除,但它位于recycle bin,可以使用闪回命令(flashback ... before drop]从中恢复。显示为BIN$...的名称有点赠品。触发器也显示BIN$...名称,表明它也在回收站中,任何索引都是。

您可以清空回收站以永久删除其中的对象。要立即删除表,而不将其转到回收站,您可以将purge关键字添加到drop命令,如in the documentation所述。这也将立即丢弃任何索引和触发器。


如果没有自动删除,那么触发器无论如何都是无关紧要的,因为你无法在丢弃的表上执行任何DML,因此它永远不会触发。如果触发器反对的表被删除。你的触发器很奇怪,它插入到同一个表中。通常,您会在一个表上插入一个触发器插入备份表(好吧,一次使用触发器)。在这种情况下,删除备份表将使实时表上的触发器无效,但不会丢弃它。只有删除实时表才会将触发器放在实时表中。