我是 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();
在触发器函数中,您可以使用隐式定义的变量OLD
和NEW
,它们分别表示原始行和更新后的行。触发器函数始终需要 RETURN 语句;您通常应该RETURN NEW
以使更新成功(尽管这是一个AFTER UPDATE
触发器,所以您也可以只是RETURN
但最好是一致)。
另请注意,此触发器函数仅使用表 live.customer_spec
中的列数据,因此不使用环境变量(您的代码中似乎就是这种情况)。更干净,更容易维护。
关于postgresql - 当表a中的列更新时用于更新表b的Postgres函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41132490/