PostgreSQL:检查函数中的新触发器和旧触发器

PostgreSQL:检查函数中的新触发器和旧触发器,postgresql,plpgsql,database-trigger,postgresql-9.5,Postgresql,Plpgsql,Database Trigger,Postgresql 9.5,我想创建一个触发器,用于计算行数并更新另一个表中的字段。我当前的解决方案适用于INSERT语句,但在删除行时失败 我目前的职能: CREATE OR REPLACE FUNCTION update_table_count() RETURNS trigger AS $$ DECLARE updatecount INT; BEGIN Select count(*) into updatecount From source_table Where i

我想创建一个触发器,用于计算行数并更新另一个表中的字段。我当前的解决方案适用于INSERT语句,但在删除行时失败

我目前的职能:

 CREATE OR REPLACE FUNCTION update_table_count()
RETURNS trigger AS
$$
DECLARE updatecount INT;
  BEGIN
      Select count(*) into updatecount 
        From source_table 
       Where id = new.id;
      Update dest_table set count=updatecount 
       Where id = new.id;
RETURN NEW;
END;
$$
LANGUAGE 'plpgsql';
触发器是一个非常基本的触发器,看起来像

CREATE TRIGGER count_trigger
AFTER INSERT OR DELETE
ON source_table
FOR EACH ROW
EXECUTE PROCEDURE update_table_count();
执行DELETE语句时,会发生以下错误:

错误:尚未分配记录“新”

细节:尚未分配记录的元组结构是不确定的

我知道一种解决方案是只为DELETE语句创建一组触发器和函数,为INSERT语句创建一组触发器和函数。但是我想做得更优雅一点,并且想知道是否有一个解决方案来检查当前上下文中是否存在新的或旧的,并且只实现一个if-ELSE块。但是我不知道如何检查这个上下文敏感的项目


感谢您的帮助

根据触发器的触发方式,使触发器功能执行不同操作的通常方法是通过


不相关,但是:语言名称是一个标识符。不要使用单引号引用

CREATE OR REPLACE FUNCTION update_table_count()
RETURNS trigger AS
$$
DECLARE 
  updatecount INT;
BEGIN
  if tg_op = 'UPDATE' then 
    select count(*) into updatecount from source_table where id = new.id;
    update dest_table set count=updatecount where id = new.id;
  elsif tg_op = 'DELETE' then 
    ... do something else
  end if;
  RETURN NEW;
END;
$$
LANGUAGE plpgsql;