【问题标题】:Compound Trigger is Triggering Only Once复合触发器仅触发一次
【发布时间】:2022-01-03 13:52:42
【问题描述】:

我有一个启用 ORDS 的架构,它接受批量 JSON 记录并将它们一一拆分,然后将它们一一插入到 UEM 表中。

我尝试创建一个触发器,该触发器获取最后插入的行的 id 并使用该值插入另一个表。问题是,下面的触发器只获取并插入最后插入的行的id,而且只插入1次。

更具体:

  1. ORDS 获取包含 4 条记录的批量 JSON 有效负载。

  2. POST 处理程序启动一个通过换行符拆分这 4 条记录的过程,并立即使用 “按级别连接” 将这些记录作为 4 行单独插入到 UEM 表的 CLOB 列中。还有自动创建和递增的 ID 列。

  3. 同时,我还想获取这些行的 ID 并在另一个表插入中使用它。我在下面创建了复合触发器,但是这个触发器只检索最后一条记录的 ID,并且只插入一行。

你认为它为什么会这样?最后,程序“插入”了 4 条记录。

CREATE OR REPLACE TRIGGER TEST_TRIGGER5
FOR INSERT ON UEM
COMPOUND TRIGGER
    lastid NUMBER;
    AFTER STATEMENT IS
        BEGIN
            SELECT MAX(ID) INTO lastid FROM UEM;
            INSERT INTO SPRINT1 (tenantid, usersessionid, newuser, totalerrorcount, userid) VALUES ('deneme', 'testsessionid', 'yes', lastid, 'asdasfqwqwe');
        END AFTER STATEMENT;
END TEST_TRIGGER5;

【问题讨论】:

    标签: sql oracle rest plsql triggers


    【解决方案1】:

    使用“按级别连接”将这些作为 4 个单独的行插入到 UEM 表的 CLOB 列中。

    您有 1 个 INSERT 语句插入 4 行。

    1. 同时,我还想获取这些行的 ID 并在另一个表插入中使用它。我在下面创建了复合触发器,但这个触发器只检索最后一条记录的 ID,并且只插入一行。

    你认为它为什么会这样?最后,程序“插入”了 4 条记录。

    它可能插入了 4 个 ROWS,但只有 1 个 STATEMENT,并且您使用的是 AFTER STATEMENT 触发器。如果您希望它为每一行运行,那么您需要使用行级触发器。

    CREATE OR REPLACE TRIGGER TEST_TRIGGER5
    AFTER INSERT ON UEM
      FOR EACH ROW
    BEGIN
      INSERT INTO SPRINT1 (tenantid, usersessionid, newuser, totalerrorcount, userid)
      VALUES ('deneme', 'testsessionid', 'yes', :NEW.id, 'asdasfqwqwe');
    END TEST_TRIGGER5;
    /
    

    db小提琴here

    【讨论】:

    • 是的,这已经奏效了。非常感谢。我多次看到“:NEW.id”格式,但我不确定如何使用它。
    【解决方案2】:

    为什么?因为它是一个语句级别触发器。如果您希望它为每一行触发,您显然会使用 row level 触发器,该触发器具有

    for each row
    

    条款。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      • 2020-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多