sql - 检查更新的记录是否是触发器中表的最后一条记录
问题描述
在触发器中,我需要知道正在更新的行是否是“最后”行。我需要知道这一点,因为只有当它是“最后”行时,我才需要更新另一个表。
我知道我可以使用带有AFTER 语句的COMPOUND TRIGGER来确定记录更新是否是“最后一个”,但我想知道是否有更简单的方法?
例如:餐桌人:
+------+-----------+
| id | name |
+------+-----------+
| 1 | Bob |
| 2 | Kenny |
+------+-----------+
表关系人事件:
+------+-----------+------------+------------+
| id | id_Person | id_event | date |
+------+-----------+------------+------------+
| 1 | 1 | 2000 | 2018-01-01 |
| 2 | 1 | 2195 | 2017-11-11 |
+------+-----------+------------+------------+
触发器在表relation_person_event上。我需要更新一个人与事件之间的关系不能超过 1 个的旧表。最后一条记录由列日期确定。
编辑 旧表:
+------+-----------+------------+------------+
| id | id_Person | id_event | date |
+------+-----------+------------+------------+
| 1 | 1 | 2000 | |
| 2 | 2 | 3589 | |
+------+-----------+------------+------------+
所有这些表只是为了给出一个如何构建数据库的简单示例。我想将所有信息从新表推送到旧表。
有没有办法确定记录更新是否是触发器中没有带有AFTER STATEMENT的COMPOUND TRIGGER的“最后一个”记录?
解决方案
我的问题的答案是否定的。我必须执行COMPOUND TRIGGER才能在正在变异的表中进行选择。
我的触发器看起来像这样:
CREATE OR REPLACE TRIGGER relation_person_event_AUR_TR
FOR UPDATE
ON relation_person_event
COMPOUND TRIGGER
date_to_update relation_person_event.date%TYPE;
idPerson relation_person_event.id_Person%TYPE;
idevent relation_person_event.id_event%TYPE;
NB_BIGGER NUMBER;
BEFORE EACH ROW IS
BEGIN
-- I can't access the :NEW in the AFTER STATEMENT,
-- so I need to save up the variables that I might use in the update.
date_to_update := :NEW.DATE;
idPerson := :NEW.id_Person;
idevent := :NEW.id_event;
END BEFORE EACH ROW;
AFTER STATEMENT IS
BEGIN
SELECT COUNT(*) INTO NB_BIGGER
FROM relation_person_event T
WHERE T.DATE > date_to_update;
-- If 0, means that im updating the "last" row.
IF NB_BIGGER = 0 THEN
UPDATE old_table O
SET O.date = date_to_update,
O.id_event = idevent
WHERE O.id_Person = idPerson;
END IF;
END AFTER STATEMENT;
END relation_person_event_AUR_TR;
这是我发现在我正在更新的表中验证某些内容的唯一方法。
推荐阅读
- swift - 初始化属性时不调用 didSet 观察者
- ruby-on-rails - 有没有办法只在添加某些属性时才运行载波?
- google-sheets - 谷歌表格条件公式
- python - pyglet:on_resize 破坏图形
- visual-studio - More elegant ways to resolve nuget dependencies for red squiggly in Visual Studio
- typescript - 打字稿类状态
- database - 使用 SID 作为服务名称的 Oracle 数据库
- r - 为 R 中 A 列的每个级别返回 B 列中的“子级别”
- protractor - 什么时候应该使用 element.isPresent() 而不是 ExpectedConditions.presenceOf(element)?
- llvm - 构建 llvm X 射线仪器时出错