oracle - 在删除之前获取 :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
但请记住,可以删除多行单个/多个用户。
解决方案
你需要一个像这样的复合触发器:
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 添加更多列才能满足您的要求。但我假设你明白了这个原则。
推荐阅读
- google-app-engine - Google App Engine 中实体和存储桶之间的关系是什么
- java - 使用 Kotlin 的 Flyway 迁移失败
- batch-file - 批处理命令查找包含特定字符的文件
- scala - 使用 spark/scala 将文件从子目录复制到 hdfs 中的基目录
- swiftui - swiftui foreach 导航链接立即弹出
- swift - 如何在 iOS 条形图中根据工作日设置数据
- c# - 更新到 Core 3.0 时 MS Identity 不起作用
- linux - 共享库的卸载顺序是否在程序退出时明确定义?
- sql-server - 从两列捕获更改 - SQL Server
- matlab - 用于文件创建的 Matlab 字符串连接