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,则正确的方法将是使用复合触发器.这避免了创建单独的包来保存密钥集合 – 它可以在触发器本身完成,

相关文章

(一)日志传送架构 (1.1)相关服务器 主服务器 :用于生产的服务器,上面运行这生产SQL Server数据库...
(一)事故背景 最近在SQL Server 2012生产数据库上配置完事物复制(发布订阅)后,生产数据库业务出现了...
(一)测试目的 目前公司使用的SQL SERVER 2012高可用环境为主备模式,其中主库可执行读写操作,备库既...
(一)背景个人在使用sql server时,用到了sql server的发布订阅来做主从同步,类似MySQL的异步复制。在...
UNION和OR谓词 找出 product 和 product2 中售价高于 500 的商品的基本信息. select * from product wh...
datawhale组队学习task03