2016-03-08 74 views
0

我有一個表像發送此更新計數器觸發的PostgreSQL

----------------------------------------------------------------------------------- 
id         | notification_sent | times_notification_sent 
----------------------------------------------------------------------------------- 
4a1717a2-6e1e-4af6-aa34-8262899aa060 | t     | 0 

這裏通知是布爾字段和times_notification_sent爲int。我正在嘗試創建觸發器,當notification_sent從true更改爲false時,會將times_notification_sent遞增1。

我正在使用下面的函數和觸發器,但它不工作。

CREATE OR REPLACE FUNCTION update_sent_counter_for_watch() RETURNS TRIGGER 
LANGUAGE plpgsql 
AS $$ BEGIN 
IF OLD.notification_sent IS TRUE AND NEW.notification_sent IS FALSE THEN 
    UPDATE "watch" SET "times_notification_sent" = "times_notification_sent" + 1 WHERE "id" = OLD."id"; 
END IF; 
END; 
$$; 

CREATE TRIGGER "update_times_sent_counter" AFTER UPDATE OF "times_notification_sent" ON "public"."watch" 
FOR EACH ROW 
WHEN (OLD.notification_sent IS DISTINCT FROM NEW.notification_sent) 
EXECUTE PROCEDURE "public"."update_sent_counter_for_watch"(); 

回答

1

你有兩個錯誤:

你並不需要一個update,只是分配新值:

CREATE OR REPLACE FUNCTION update_sent_counter_for_watch() 
    RETURNS TRIGGER 
    LANGUAGE plpgsql 
AS 
$$ 
BEGIN 
    IF OLD.notification_sent IS TRUE AND NEW.notification_sent IS FALSE THEN 
    new.times_notification_sent := old.times_notification_sent + 1; 
    END IF; 
    RETURN new; 
END; 
$$; 

而且你不能在after update TRIGER更改值,您需要將其更改爲before觸發器:

CREATE TRIGGER "update_times_sent_counter" BEFORE UPDATE OF "times_notification_sent" 
    ON "public"."watch" 
    FOR EACH ROW 
WHEN (OLD.notification_sent IS DISTINCT FROM NEW.notification_sent) 
EXECUTE PROCEDURE "public"."update_sent_counter_for_watch"();
+0

你們倆都是corr等。非常感謝您的幫助。 – nicholasnet

+0

@帕特里克:謝謝,糾正 –