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

时间:2016-12-13 23:43:23

标签: 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 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 set customer_enabled = $ 2其中customer_env_name = $ 1;   结束; $$ LANGUAGE plpgsql;

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

1 个答案:

答案 0 :(得分:0)

基本上,您需要做的是:

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中列的数据,因此不使用任何环境变量(在您的代码中似乎就是这种情况)。更清洁,更容易维护。