在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
但是请记住,可以删除多行的单个/多个用户。
答案 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添加更多列才能运行您的需求。但是我想你已经明白了。