通过触发更新Oracle 11g后更新值

时间:2014-06-17 01:26:34

标签: sql oracle triggers oracle11g

我正在开发一个小型图书馆数据库,我不想让某人更新某人的ID。但我需要使用AFTER UPDATE和FOR EACH STATEMENT(我告诉他们是Oracle默认的)。因此,基本上,如果有人更新了客户信息并更改了他/她的ID或错误输入,则触发器会自动将其再次更新为旧值。问题是Oracle在使用FOR EACH STATEMENT时不会让我使用:NEW和:OLD。这个问题有没有解决方法?

CREATE OR REPLACE TRIGGER alter_id_trigger
AFTER UPDATE ON CUSTOMER
BEGIN
   UPDATE CUSTOMER SET ID = :OLD.ID
   WHERE ID = :NEW.ID;
END;

谢谢!

2 个答案:

答案 0 :(得分:4)

使用以下代码进行触发。 已完成的更改:

  1. 使用BEFORE UPDATE而不是AFTER UPDATE。
  2. 将ID的值设置为之前的值。 (永远不会修改ID字段)

    CREATE OR REPLACE TRIGGER ALTER_ID_TRIGGER BEFORE UPDATE ON CUSTOMER BEGIN SET :NEW.ID = :OLD.ID END;

  3. 注意:使用 BEFORE UPDATE:

    • 您无法在视图上创建BEFORE触发器。
    • 可以更新:新值。
    • 无法更新:OLD值。

答案 1 :(得分:2)

我认为您需要之前的更新触发器:

CREATE OR REPLACE TRIGGER alter_id_trigger
BEFORE UPDATE ON CUSTOMER
BEGIN
   SET :NEW.ID = :OLD.ID
END;

您可以测试以查看值是否正在更改,但这似乎是不必要的。