首页 > 解决方案 > 在删除之前获取 :NEW 表

问题描述

在 Oracle 中创建触发器时,如果触发器为 FOR EACH ROW,则可以选择使用新值和旧值。

我需要整个表,因为我不使用 FOR EACH ROW。

我有两个表: Table1:User_Hist(ID,EID,NAME,VALID_FROM) Table2:User(ID,NAME,VALID_FROM)

在 Table2 中是一个外键约束 USER(ID, VALID_FROM) REFERENCES USER_HIST(EID, VALID_FROM)

User_Hist 表随时间存储有关用户的所有信息。用户表应该只存储最新的用户。

如果删除了最新的行,则约束将停止此操作。

所以我的想法是在 TRIGGER 中更新表用户。

在 User_Hist 的 BEFORE DELETE 触发器中将是一个更新表用户的 MERGE 语句。但我需要删除哪些行,最好是 :NEW 表。

有人可以按照我的解释...

也许这有帮助

User_hist:
ID...EID........NAME........VALID_FROM
1.....1.......Sarah Summer... ..2010-01-01
2.......1.......莎拉米勒............2013-01-01

删除 ID2 之前的用户:
ID.....NAME........VALID_FROM
1......Sarah Miller......2013-01-01

删除 ID2 后的 USER:
ID.....NAME........VALID_FROM
1......Sarah Summer.....2010-01- 01

但请记住,可以删除多行单个/多个用户。

标签: oracleplsqltriggersoracle12c

解决方案


你需要一个像这样的复合触发器:

CREATE OR REPLACE TRIGGER user_trigger
   FOR DELETE ON USER_HIST
   COMPOUND TRIGGER

TYPE IdTableType IS TABLE OF USER_HIST.EID%TYPE;
IdTable IdTableType;

BEFORE STATEMENT IS   
    -- Initialize IdTable 
    BEGIN       
        IdTable := IdTableType();
    END BEFORE STATEMENT;

BEFORE EACH ROW IS   
    -- Add deleted rows to IdTable 
    BEGIN       
        IdTable.EXTEND;
        IdTable(IdTable.LAST) := :OLD.EID;
    END BEFORE EACH ROW;

AFTER STATEMENT IS 
    -- Process each row after statement
    BEGIN
       FOR i IN IdTable.FIRST..IdTable.LAST LOOP
           -- Do whatever you need for your row
           ...
           WHERE EID = IdTable(i);
       END LOOP;
    END AFTER STATEMENT;    

END;
/

也许您必须从​​表 USER_HIST 添加更多列才能满足您的要求。但我假设你明白了这个原则。


推荐阅读