Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 用于在更新表a中的列时更新表b的Postgres函数_Postgresql_Triggers - Fatal编程技术网

Postgresql 用于在更新表a中的列时更新表b的Postgres函数

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

我不熟悉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 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分钟后,我意识到我看错了字段,我意识到上述解决方案有效。。再次感谢!