RDBMS是否在需要时删除其触发器?

时间:2012-01-21 23:11:53

标签: oracle triggers

假设我们有一个名为Foo的触发器。

Foo取决于T表,取决于a,b,c列。

如果T表被删除,T触发器也会被删除?

如果c被删除,T触发器是否会被丢弃?

如果T表发生了变更,但它不影响a,b,c列,T触发器是否会被丢弃?

提前感谢您的回答,

祝你好运, Lajos Arpad。

3 个答案:

答案 0 :(得分:3)

刚试过,我可以回答你的三个问题:

  1. 如果您删除表 T ,则触发器也会被删除。
  2. 如果删除触发器所依赖的列(例如示例中的 c ),则触发器不会被删除,而是会变为无效。然后,如果表上的触发事件发生(例如,触发器是BEFORE INSERT触发器并且您INSERT进入表中),则会得到ORA-04098'触发器XYZ无效且重新验证失败'错误
  3. 如果您对不影响触发器的表 T 进行更改,则触发器不会被删除并保持有效。

答案 1 :(得分:1)

在没有显式

的情况下删除触发器的唯一情况
DROP TRIGGER <trigger_name>;

表格何时也被删除。

DROP <TABLE_NAME>;  

如果触发器的源代码引用不再存在的架构,则触发器将变为无效。您可以使用以下命令查询数据库中的无效对象:

   select * from user_objects where status != 'VALID'  
   -- invalid objects associated with the user you are logged in as
   select * from all_objects where status != 'VALID' 
   -- all invalid objects  in the database

当您指定级联时,有一种情况是“级联”。但这主要是放弃子表。

drop table <table_name> cascade constraints;

关于DROP TABLE DDL命令的Oracle 10g文档。

所有这些触发器经常被滥用并引入错误。我鼓励你避免将应用程序逻辑放在其中。

答案 2 :(得分:0)

您应该尝试这个或咨询Oracle文档/支持。我现在无法访问Oracle数据库(这是周末;-))来验证它,但据我记得,这些操作的结果如下:

  1. 是(触发器是相应表格的一部分)
  2. 对触发器没有影响
  3. 对触发器没有影响