首页 > 解决方案 > 更新oracle之前触发问题[PL/SQL]

问题描述

桌子:

CREATE TABLE EXAMPLE1 (column1 integer, column2 integer, column3 integer);

插入:

INSERT INTO EXAMPLE1 VALUES (1,11,111);

扳机:

create or replace TRIGGER trigger_name
BEFORE UPDATE OF COLUMN1 ON EXAMPLE1
FOR EACH ROW
BEGIN
    RAISE_APPLICATION_ERROR(-20000, 'You can't directly update this column.');
END;

更新:

UPDATE EXAMPLE1 SET COLUMN1 = 2 WHERE COLUMN2 = 11;

因此,当我尝试更新 column1 (column1 = 2) 触发器时,应该执行并告诉我不能直接更改该列,但是如果我执行这样的查询:

UPDATE EXAMPLE1 SET column1 = 1, column2 = 22 where column3 = 111;

我的意思是我在哪里发送 column1 = 1(column1 等于 1)所以没有改变值,它应该更新表,因为我只改变 column2,column1 保持不变等于 1。

标签: sqldatabaseoracleplsqltriggers

解决方案


无论新值是什么,您仍在更新该列,在您的触发器中,您必须检查该值是否正在更改:

CREATE OR REPLACE TRIGGER trigger_name
BEFORE UPDATE OF COLUMN1 ON EXAMPLE1
FOR EACH ROW
BEGIN
    IF DECODE(:new.column1, :old.column1, 1, 0) = 0 THEN
      RAISE_APPLICATION_ERROR(-20000, 'You can''t directly update this column.')
    END IF
END;

推荐阅读