Postgresql 用于在更新表a中的列时更新表b的Postgres函数
我不熟悉postgres触发器和函数,目前我在表a上设置触发器以更新表B时遇到了一个问题,表a中的布尔列从true切换到false,反之亦然 表B是一个“映射”表,它包含来自表a/表B和其他表的值,这些表没有任何可靠的链接方式,因此我正在创建触发器以将数据传播到此映射表 触发器和触发器功能如下:Postgresql 用于在更新表a中的列时更新表b的Postgres函数,postgresql,triggers,Postgresql,Triggers,我不熟悉postgres触发器和函数,目前我在表a上设置触发器以更新表B时遇到了一个问题,表a中的布尔列从true切换到false,反之亦然 表B是一个“映射”表,它包含来自表a/表B和其他表的值,这些表没有任何可靠的链接方式,因此我正在创建触发器以将数据传播到此映射表 触发器和触发器功能如下: --TRIGGER FUNCTION TO UPDATE CCM AFTER ENVIRONMENT TYPE IS CHANGED -- THIS SHOULD BE A TRIGGER BASED
--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文本,客户启用布尔值)
返回VOID作为$$
开始
更新live.customer_control_映射集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
,它们分别表示原始行和更新行。触发函数总是需要一个返回
语句;通常,您应该返回新的
以使更新成功(尽管这里是一个更新后
触发器,因此您也可以返回
,但最好保持一致)
还请注意,此触发器函数仅使用表
live.customer_spec
中列的数据,因此不使用环境变量(代码中似乎就是这种情况)。更清洁、更易于维护。基本上,您需要做的是:
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
,它们分别表示原始行和更新行。触发函数总是需要一个返回
语句;通常,您应该返回新的
以使更新成功(尽管这里是一个更新后
触发器,因此您也可以返回
,但最好保持一致)
还请注意,此触发器函数仅使用表
live.customer_spec
中列的数据,因此不使用环境变量(代码中似乎就是这种情况)。更干净,更易于维护。感谢您的快速响应,大约10分钟后,我意识到我看错了字段,我意识到上述解决方案有效。。再次感谢!感谢您的快速回复,大约10分钟后,我意识到我看错了字段,我意识到上述解决方案有效。。再次感谢!