【问题标题】:Check if the record updated is the last record of the table in a trigger检查更新的记录是否是触发器中表的最后一条记录
【发布时间】:2018-07-04 02:31:45
【问题描述】:

在触发器中,我需要知道正在更新的行是否是“最后”行。 我需要知道这一点,因为只有当它是“最后”行时,我才需要更新另一个表。

我知道我可以使用带有 AFTER STATEMENTCOMPOUND TRIGGER 来确定记录更新是否是“最后一次”,但我想知道是否有更简单的方法怎么办?

前: 表

+------+-----------+
|  id  |   name    |
+------+-----------+
| 1    |   Bob     |
| 2    |   Kenny   |
+------+-----------+

relation_person_event

+------+-----------+------------+------------+
|  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   |            |
+------+-----------+------------+------------+

所有这些表只是为了给出一个如何构建数据库的简单示例。我想将新表中的所有信息推送到旧表中。

有没有办法确定记录更新是否是触发器中的“最后一个”记录,没有 COMPOUND TRIGGERAFTER STATEMENT

【问题讨论】:

  • 为什么需要触发器?在应用程序逻辑中处理该更新。另外,当你说“我需要更新一个旧表”时,那个表的定义是什么,你想更新哪一列?
  • @KaushikNayak 旧桌子肯定会在几年内被销毁。它未映射到应用程序中。由于它会被销毁,因此销毁触发器比修改应用程序更容易。
  • 好吧,在这种情况下更改应用程序将是为它编写一个单独的程序,(或者甚至更好地每天/每周运行它,或者如果可能的话,任何适合您的计划工作),简单删除旧表后对其进行评论。只要它正在更新,触发器就意味着主表上的不必要负载。
  • 我明白你的意思,但更改应用程序意味着主要生产毕业(在我的工作地点)。触发器的破坏奇怪地不被视为毕业。我也想过安排一份工作,但它不适合我的需要。

标签: sql plsql


【解决方案1】:

我的问题的答案是否定的。 我必须执行 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;

这是我发现验证正在更新的表中的某些内容的唯一方法。

【讨论】:

    猜你喜欢
    • 2012-07-27
    • 2012-06-14
    • 2021-10-16
    • 2013-09-01
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多