2016-10-17 53 views
0

我第一次使用触发器,案例和存在,并不能找出问题。我已经替换了表名是属性,以方便响应者。Postgres语法错误 - 触发器

从本质上讲,我想的是:当我插入一个条目,以我的态表,

  • 如果新条目的主键在颞表已经存在,我想这个新条目的开始日期成为之前记录的结束日期。

  • 如果新条目对表完全是新的,则不会发生任何事情(插入操作如常)。

的代码是:

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(); 
+0

你有什么问题?有错误吗?如果是这样,请提供错误详细信息。 – Nicarus

回答

0

您有在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隐变量truefalse然后你可以检查。

但是,如果这是您的触发器功能中的所有逻辑(即没有任何零件您不在此处显示),您可以简单地忽略检查并直接执行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;