插入后更新PosgreSQL触发函数

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

我是PosgreSQL触发器的新手。根据文档,我试图使触发器功能,但它不起作用,不知道为什么。在我的数据库记录中插入了一个抓取信息。我想根据所选条件更新新插入的记录。这是我的触发函数代码:

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;

删除此RETURN NEW后,出现错误END IF;和相同的消息。

postgresql database-trigger
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.