sql – 在表上实现语句级触发器时,是否可以获取所有受影响行的OLD和NEW记录?

在Oracle中,您可以通过在CREATE TRIGGER语句中指定FOR EACH ROW子句来编写行级触发器:
CREATE TRIGGER MY_FANCY_TRIGGER
  BEFORE UPDATE ON MY_TABLE
  FOR EACH ROW
BEGIN
  IF :OLD.my_id_column > 4 AND :NEW.some_other_column <> 'foo' THEN
    -- ...
  END IF;
END;

这样的触发器允许您查看每个受影响行的前后版本(分别为:OLD和:NEW).例如,以下语句将导致此触发器对MY_TABLE中的每一行执行一次:

UPDATE MY_TABLE SET some_other_column = 'bar';

通过消除FOR EACH ROW子句,触发器将成为一个语句级触发器.这意味着它只对每个语句执行一次,而不管该语句受到多少行(如果有)).不幸的是,语句级触发器没有:OLD和:NEW变量可用(因为受影响的行数量有所不同).

是否可以获得以下内容:OLD和:NEW语句级触发器中所有受影响行的值?我有一些处理,我宁愿只发生一次声明.

解决方法

一种方法是由Justin Cave提出的方法,将信息存储在单独的包集合中的行级触发器中.

如果您使用11g,则正确的方法将是使用复合触发器.这避免了创建单独的包来保存密钥集合 – 它可以在触发器本身完成,

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 &#39;EastRiver&#39; 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...