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 语句并使用触发器执行将引发异常并正常执行。任何解决此问题的提示将不胜感激。
【问题讨论】:
触发器是高度特定于供应商的 - 所以请添加一个标签来指定您使用的是mysql
、postgresql
、sql-server
、oracle
还是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 创建触发器以在特定条件下更新表的主要内容,如果未能解决你的问题,请参考以下文章