在删除之前获取:NEW表

时间:2019-06-07 11:27:25

标签: oracle plsql triggers oracle12c

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

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

我有两个表: 表1:User_Hist(ID,EID,NAME,VALID_FROM) 表2:用户(ID,NAME,VALID_FROM)

表2中的外键约束是USER(ID,VALID_FROM)参考USER_HIST(EID,VALID_FROM)

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

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

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

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

有人可以听我的解释吗...

也许有帮助

User_hist:
ID ... EID ..... NAME ................. VALID_FROM
1 ..... 1 .......萨拉(Sarah Summer)..... 2010-01-01
2 ..... 1 ....... Sarah Miller .......... 2013-01-01

删除ID2之前的用户:
ID ..... NAME .............. VALID_FROM
1 ......萨拉·米勒(Sarah Miller)..... 2013-01-01

删除ID2后的用户:
ID ..... NAME .................. VALID_FROM
1 ......萨拉夏天..... 2010-01-01

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

1 个答案:

答案 0 :(得分:0)

您将需要这样的复合触发器:

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添加更多列才能运行您的需求。但是我想你已经明白了。