[英]Postgres Syntax Error - Triggers
我第一次使用觸發器,案例和存在,但無法找出問題所在。 我已將表名替換為響應者方便的屬性。
本質上,我想要的是:當我在時態表中插入一個條目時,
如果新條目的主鍵已經存在於臨時表中,則我希望此新條目的開始日期為上一條記錄的結束日期。
如果新條目對表來說是全新的,則什么也不會發生(插入操作照常進行)。
代碼是:
CREATE OR REPLACE FUNCTION update_End_Date()
RETURNS trigger AS
$$
BEGIN
SELECT CASE
WHEN EXISTS ( SELECT TemporalTable.primaryKey FROM TemporalTable WHERE primaryKey = NEW.primaryKey )
THEN
UPDATE
TemporalTable
SET
TemporalTable.DtEnd = NEW.DtStart
WHERE
TemporalTable.PrimaryKey = NEW.PrimaryKey AND
TemporalTable.DtEnd IS NULL
;
END
RETURN NEW;
RETURN NEW;
END;
$$
LANGUAGE 'plpgsql';
CREATE TRIGGER update_End_Date
BEFORE INSERT
ON Table1
FOR EACH ROW
EXECUTE PROCEDURE update_End_Date();
關於在SELECT
語句中使用CASE
子句,您在概念上存在錯誤:您評估一些條件以產生選擇列表的輸出。 相反,您可以像使用C
這樣的過程語言一樣,將其用作邏輯分支操作。 由於觸發器始終以plpgsql
程序語言編寫,因此您可以輕松地重寫觸發器函數,如下所示:
CREATE OR REPLACE FUNCTION update_End_Date() RETURNS trigger AS $$
BEGIN
PERFORM * FROM TemporalTable WHERE primaryKey = NEW.primaryKey;
IF FOUND THEN
UPDATE TemporalTable
SET DtEnd = NEW.DtStart
WHERE PrimaryKey = NEW.PrimaryKey AND DtEnd IS NULL;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
PERFORM
命令檢查是否存在某些數據而不返回任何數據,並將FOUND
隱式變量設置為true
或false
,然后可以進行檢查。
但是,如果這是觸發函數中的全部邏輯(即,沒有在此處未顯示的部分),您可以簡單地省略檢查並直接執行UPDATE
:如果沒有記錄可更新,則什么也不會發生,並且觸發功能只是繼續:
CREATE OR REPLACE FUNCTION update_End_Date() RETURNS trigger AS $$
BEGIN
UPDATE TemporalTable
SET DtEnd = NEW.DtStart
WHERE PrimaryKey = NEW.PrimaryKey AND DtEnd IS NULL;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.