将表属性转换为常量

时间:2018-04-02 23:14:50

标签: sql oracle

我一直试着用几个小时来绕过这个,我不确定是否可能。我目前正在为数据库开发一些触发器,其中一个声明在特定的表中,只能修改一个属性。其余的不能在原始输入后更改。

这实际上可行吗?

1 个答案:

答案 0 :(得分:1)

在Oracle中,这很容易,我一直这样做。我有很多表格,其中包含CREATED_DT,CREATED_BY列,我只想在创建记录时设置它。每次更改记录时都会设置MODIFIED_DT,MODIFIED_BY。触发器显示如下:

CREATE OR REPLACE TRIGGER myschema.BILLING_SUMMARY_CHARGE_TRG
   BEFORE INSERT OR UPDATE
   ON myschema.billing_summary_charge
   REFERENCING NEW AS new OLD AS old
   FOR EACH ROW
BEGIN
   :new.modified_dt   := SYSDATE;
   :new.modified_by   := USER;

   IF INSERTING
   THEN
      :new.i_charge_pk   := billing_summary_charge_seq_pk.NEXTVAL;
      :new.created_dt    := :new.modified_dt;
      :new.created_by    := :new.modified_by;
   END IF;

   -- Don't allow creation columns to change on an update
   IF UPDATING
   THEN
      :new.i_charge_pk   := :old.i_charge_pk;
      :new.created_dt    := :old.created_dt;
      :new.created_by    := :old.created_by;
   END IF;
END billing_summary_charge_trg;

在上面的示例中,插入记录时初始化列i_charge_pk,created_dt和created_by。更新记录时会为它们分配旧值,以防止应用程序发生任何可能的更改。