代码之家  ›  专栏  ›  技术社区  ›  Mauricio

取消触发器内部的插入而不回滚

  •  1
  • Mauricio  · 技术社区  · 15 年前

    对于某项作业,我的任务是创建一个非常简单的问答网站,包括带标签的问题和带评论的答案。


    问题是,我不能通过回滚整个事务来取消触发器,包括 UPDATE ,从而破坏了触发器的作用。

    更新

    " 创建触发器,检查要添加的任何标记以前是否不存在于数据库中。如果存在,则对应行中的use列必须递增1 "
    Crear el触发器 tg_insertar_tag 在拿督的基础上,你可以修改你的新标签 ; ")

    这一要求无法改变或避免,尽管存在漏洞是值得欢迎的。


    作为参考,我当前的触发代码:

    CREATE OR REPLACE TRIGGER tg_insertar_tag BEFORE INSERT ON Tag
    FOR EACH ROW
    DECLARE
        tagCount integer;
        v_usos integer;
    BEGIN
        SELECT COUNT(*) INTO tagCount FROM Tag WHERE nombre = :new.nombre;
        SELECT Usos INTO v_usos FROM Tag WHERE nombre = :new.nombre;
        IF tagCount > 0 THEN
            UPDATE Tag SET usos = v_usos + 1 WHERE nombre = :new.nombre;
        ELSE
            :new.usos := 1;
        END IF;
    END;
    
    2 回复  |  直到 15 年前
        1
  •  1
  •   Quassnoi    15 年前

    这不是表上触发器的作用。

    你应该使用 MERGE 存储过程中的语句 INSTEAD OF 触发或仅来自客户端:

    MERGE
    INTO    tag tc
    USING   (
            SELECT  :NEW.nombre
            FROM    dual
            ) t
    ON      (tc.nombre = t.nombre)
    WHEN MATCHED THEN
    UPDATE
    SET     usos = usos + 1
    WHEN NOT MATCHED THEN
    INSERT  (nombre, usos)
    VALUES  (nombre, 1)
    

    MERGE
    INTO    tag tc
    USING   (
            SELECT  tag, COUNT(*) AS cnt
            FROM    TABLE(:mycollection)
            GROUP BY
                    nombre
            ) t
    ON      (tc.nombre = t.nombre)
    WHEN MATCHED THEN
    UPDATE
    SET     usos = usos + cnt
    WHEN NOT MATCHED THEN
    INSERT  (nombre, usos)
    VALUES  (nombre, cnt)
    

    在将接受集合作为参数的存储过程中。

        2
  •  0
  •   Randy    15 年前

    然后,当insert通过时,使用后触发器逻辑也将其插入到主表中。