[英]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.