PostgreSQL 插入后触发函数更新

问题描述 投票:0回答:1

我是 PostgreSQL 触发器的新手。根据文档,我试图制作触发器功能,但它不起作用并且不明白为什么。

有一个抓取插入到我的房地产数据库记录中。我想根据选定的条件更新新插入的记录。

这是我的触发功能代码:

CREATE OR REPLACE FUNCTION czynsz_clear() RETURNS TRIGGER AS $body$
    BEGIN
            IF administrative_fees IS NOT NULL
                AND administrative_fees_m2 IS NULL
                AND area IS NOT NULL
                AND type_id IN (6,1)
                AND administrative_fees > 1 AND area > 1
            THEN
            UPDATE realestates_realestate SET administrative_fees_m2 = TRUNC((administrative_fees/ AREA):: INTEGER,2)
            RETURN NEW;
            END IF;
    END;
$body$ LANGUAGE plpgsql;

所以逻辑是这样的: 将新记录插入数据库realestates_realestate后,我想检查:所选字段是否为空或其他条件,然后进行更新。 创建函数后,我想让触发器在插入表后启动此函数。

我做错了什么?我正在使用 HeidiSQL (10.3.0.5771) 并出现此消息:

错误:RETURN 附近的语法错误。第 11 行:返回新的;

我删除这个 RETURN NEW 后,出现错误,END IF;,和同样的消息。

postgresql triggers
1个回答
0
投票

如果要更改刚刚插入的行,请勿使用

UPDATE
将值分配给字段或新记录。

要访问列值,还可以使用

new
记录。

类似这样的:

CREATE OR REPLACE FUNCTION czynsz_clear() 
  RETURNS TRIGGER 
AS $body$ 
BEGIN
  if new.administrative_fees IS NOT NULL 
     AND new.administrative_fees_m2 IS NULL 
     AND new.area IS NOT NULL
     AND new.type_id IN (6,1)
     AND new.administrative_fees > 1 
     AND new.area > 1
  THEN    
    new.administrative_fees_m2 := TRUNC((administrative_fees/ AREA)::INTEGER,2);
  END IF;

  RETURN NEW; -- this needs to be outside of the IF
END;
$body$ LANGUAGE plpgsql;

这假设触发器被定义为行级触发器,例如

您还需要将其设为 BEFORE 触发器

create trigger ..
  BEFORE INSERT OR UPDATE on ....
  FOR EACH ROW execute procedure czynsz_clear();

您收到的错误是由于您的 UPDATE 语句未以

;
结束而引起的。但即使修复了这个问题,您也会收到错误,因为列名称(在
IF
部分)不能像这样引用。

最后,触发器仅在

IF
条件为真时才起作用,因为否则触发器不会返回任何内容。因此
return new;
需要位于
IF
语句之外。

© www.soinside.com 2019 - 2024. All rights reserved.