SQL 创建触发器以在特定条件下更新表

Posted

技术标签:

【中文标题】SQL 创建触发器以在特定条件下更新表【英文标题】:SQL Create Trigger to Update Table under certain conditions 【发布时间】:2021-12-13 07:16:45 【问题描述】:

我想创建一个触发器,当满足新表插入的特定条件时,插入的表和相应的表都会更新。我希望首先清除这些表,然后使用我指定的函数重新填充它们。到目前为止我有这个

CREATE FUNCTION test_fxn() RETURNS TRIGGER AS $test_fxn$
    BEGIN
       IF NEW.variable2 > x IS TRUE THEN
          RAISE EXCEPTION 'too long';
       END IF;
       IF NEW.variable2 < x IS TRUE THEN
INSERT INTO summary_table (variable1, variable2) VALUES (NEW.variable1, NEW.variable2);
          RAISE EXCEPTION 'correct';
      
       END IF;
    END;
$test_fxn$ LANGUAGE plpgsql;

CREATE TRIGGER test_fxn BEFORE INSERT OR UPDATE ON detailed_table
    FOR EACH ROW EXECUTE PROCEDURE test_fxn();

尽管出现了异常,但新插入的行并没有像我希望的那样被复制到 summary_table 中。此外,它似乎也没有出现在 detail_table 中,但是删除 INSERT INTO 语句并使用触发器执行将引发异常并正常执行。任何解决此问题的提示将不胜感激。

【问题讨论】:

触发器是高度特定于供应商的 - 所以请添加一个标签来指定您使用的是mysqlpostgresqlsql-serveroracle 还是db2 - 或完全不同的东西。 您的触发器函数中缺少return new;。 INSERT 或 UPDATE 应导致错误“control达到了触发器过程结束而没有返回 "尽管出现了异常,但新插入的行并没有像我希望的那样被复制到 summary_table 中" - 触发器中的 INSERT 是一部分触发触发器的同一事务。异常会强制该事务回滚 - 包括 INSERT 到 summary_table。您正在寻找 Postgres 并不真正支持的“自治事务”。在此站点中搜索“自治事务”和 postgres - 有一些变通方法,例如使用dblink 模块 【参考方案1】:

您的问题是RAISE EXCEPTION 'correct';。异常会导致 PostgreSQL 中的错误,并且该错误会导致整个事务(包括触发器的效果)回滚。

使用RAISE NOTICE 向客户端发送信息性消息。

【讨论】:

我添加了 RETURN NEW 并更改了通知的例外情况,但信息仍未按预期插入到 summary_table 中。有没有进一步的解决方案? 如果显示通知,则插入将发生。也许你回滚了整个事务。

以上是关于SQL 创建触发器以在特定条件下更新表的主要内容,如果未能解决你的问题,请参考以下文章

创建触发器以在更新表之后插入

pl/sql 触发器完整性约束问题

特定场景下SQL的优化

关于SQL触发器 B表读取A表的字段信息 并更新到指定的B表字段

sql中如何更新符合条件的值

SQL Server 触发器插入/更新特定列