postgresql - 当表a中的列更新时用于更新表b的Postgres函数

标签 postgresql triggers

我是 postgres 触发器和函数的新手,目前在表 A 上设置触发器以在表 A 中的 bool 列从 true 切换为 false 或反之亦然时更新表 B 时遇到问题。

表 B 是一个“映射”表,其中包含表 A/表 B 和其他没有任何可靠链接方式的表的值,因此我正在创建触发器以将数据传播到此映射表。

触发器和触发器函数如下:

--TRIGGER FUNCTION TO UPDATE CCM AFTER ENVIRONMENT TYPE IS CHANGED
--  THIS SHOULD BE A TRIGGER BASED FUNCTION - NO INPUT WILL BE PASSED
--  THIS WILL NEED TO BE DONE POST UPDATE ON THE RECORD
CREATE OR REPLACE FUNCTION live.ccmu4statust()
  RETURNS TRIGGER AS $$
  BEGIN
    CASE WHEN TG_ARGV[0] = 'true' THEN
      UPDATE live.customer_control_mapping set enabled = true where customer_env_name = TG_ARGV[0];
    ELSE
      UPDATE live.customer_control_mapping set enabled = false where customer_env_name = TG_ARGV[0];
    END CASE;
  END;
$$ LANGUAGE plpgsql;

--TRIGGER ON LIVE.CUSTOMER_SPEC
--  SHOULD ONLY EXECUTE WHEN A CUSTOMER_ENV_STATUS IS UPDATED
-- RESULTED IN A CASTING ISSUE FOR BOOLEAN VALUE
CREATE TRIGGER ccmu4statusJello
AFTER UPDATE
ON live.customer_spec
FOR EACH ROW
EXECUTE PROCEDURE live.ccmu4statust('customer_env_name','customer_enabled');

The error that I am getting is:
Error: ERROR: control reached end of trigger procedure without RETURN
  Where: PL/pgSQL function live.ccmu4statust()
SQLState:  2F005
ErrorCode: 0

任何帮助将不胜感激,请注意映射表是开发功能所必需的,我无法删除它,因此我需要更新工作。

手动功能对我有用(如下)-它是作为测试完成的。

创建或替换函数 live.ccmu4status(custEnvName text,customer_enabled boolean) 返回无效为 $$ 开始 更新 live.customer_control_mapping 设置 customer_enabled = $2 其中 customer_env_name = $1; 结尾; $$ 语言 plpgsql;

再次感谢,祝您有美好的一天!

最佳答案

基本上,您需要执行以下操作:

CREATE FUNCTION live.ccmu4statust() RETURNS trigger AS $$
BEGIN
    IF NEW.env_status != OLD.env_status THEN
        UPDATE live.customer_control_mapping
        SET enabled = NEW.env_status
        WHERE customer_env_name = NEW.env_name;
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER ccmu4statusJello
AFTER UPDATEON live.customer_spec
FOR EACH ROW EXECUTE PROCEDURE live.ccmu4statust();

在触发器函数中,您可以使用隐式定义的变量OLDNEW,它们分别表示原始行和更新后的行。触发器函数始终需要 RETURN 语句;您通常应该RETURN NEW以使更新成功(尽管这是一个AFTER UPDATE触发器,所以您也可以只是RETURN但最好是一致)。

另请注意,此触发器函数仅使用表 live.customer_spec 中的列数据,因此不使用环境变量(您的代码中似乎就是这种情况)。更干净,更容易维护。

关于postgresql - 当表a中的列更新时用于更新表b的Postgres函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41132490/

相关文章:

sql - 如何从Postgres中的嵌套估计中找到需要的 Material

javascript - 如何使用 javascript/jquery 使 <a> 标签元素触发多个功能

MySQL - 触发器以防止通过连接的表进行删除

mysql - 触发器内不同条件选择的多个 IF

sql - 使用没有 FOREIGN KEY 的 REFERENCES 是否仍会创建外键?

sql - INNER JOIN 中的多个条件

javascript - 如何使用 JS/Jquery 检测输入值何时动态变化

python - PsychoPy:使用 XP 32 位通过 PC 的并行端口发送触发器

postgresql - 如何在 Postgres 的 plv8 函数中返回 JSON 行?

java - JPA Hibernate Postgres 精度不起作用