PostgreSQL:检查函数中的新触发器和旧触发器
我想创建一个触发器,用于计算行数并更新另一个表中的字段。我当前的解决方案适用于INSERT语句,但在删除行时失败 我目前的职能: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
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;