如何在触发器oracle中获取所有已删除或更新的行

时间:2012-11-13 14:12:03

标签: sql oracle triggers

如何在触发器中获取所有受影响的行。

在sybase中有一个“已删除”表,用于在删除和更新语句期间存储受影响行的副本

sybase documentation

oracle中是否有任何解决方案在表级触发器中执行相同的操作?

2 个答案:

答案 0 :(得分:1)

您可以在触发器中使用newold值:

CREATE OR REPLACE TRIGGER trigger_name
  BEFORE DELETE OR UPDATE ON table_name
  FOR EACH ROW
BEGIN    
    dbms_output.put('Old: ' || :old.column);
    dbms_output.put('New: ' || :new.column);
END;
/

这与sybase不同,但它正是你在寻找什么。

Here您可以找到更多信息。

答案 1 :(得分:1)

与Oracle中我所知道的“已删除”表格没有类似之处。

根据您需要执行的操作,您可以使用compound trigger在受语句影响的行上完成基于集合的操作,如Tim Hall的oracle-base site中所述。使用此方法,您可以定义累积(例如)值或计数的行级触发器,将其存储在触发器的全局部分中,并在触发器的AFTER INSERT | UPDATE | DELETE部分中访问这些值。全局变量在所有触发点的整个持续时间内保持定义。

然而,当触发器变得复杂时,我不再喜欢基于触发器的解决方案而不是将代码放在应用程序包/过程/函数中。