由于触发器,无法删除 PostgreSQL table 中的记录
Cannot delete record in PostgreSQL table due to trigger
我想删除 table 中的一条记录,它有这样的触发器:
CREATE OR REPLACE FUNCTION public.notify_trigger()
RETURNS trigger AS
$BODY$
DECLARE
BEGIN
PERFORM pg_notify('watchers',
'{' ||
'"table":"' || TG_TABLE_NAME || '",' ||
'"operation":"'|| TG_OP || '",' ||
'"row":' || (select row_to_json(row)::varchar from (SELECT NEW.*) row) ||
'}'
);
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION public.notify_trigger()
OWNER TO postgres;
当我尝试使用 delete from test_notify where id = 1277
删除记录时,它 returns 出现如下错误:
ERROR: record "new" is not assigned yet
DETAIL: The tuple structure of a not-yet-assigned record is indeterminate.
CONTEXT: SQL statement "SELECT pg_notify('watchers',
'{' ||
'"table":"' || TG_TABLE_NAME || '",' ||
'"operation":"'|| TG_OP || '",' ||
'"row":' || (select row_to_json(row)::varchar from (SELECT NEW.*) row) ||
'}'
)"
PL/pgSQL function notify_trigger() line 4 at PERFORM
********** Error **********
在 test_notify
table 我有一个这样的触发器:
CREATE TRIGGER watched_table_trigger
AFTER INSERT OR UPDATE OR DELETE
ON public.test_notify
FOR EACH ROW
EXECUTE PROCEDURE public.notify_trigger();
写触发器的人显然犯了一个错误:NEW
未在 ON DELETE
触发器中定义。
最好的解决方案是删除触发器并使用 ON INSERT OR UPDATE
重新创建它。
要暂时阻止触发器触发,您可以将 session_replication_role
设置为 replica
。请注意,这也会禁用外键约束,因此只能由超级用户更改。
我想删除 table 中的一条记录,它有这样的触发器:
CREATE OR REPLACE FUNCTION public.notify_trigger()
RETURNS trigger AS
$BODY$
DECLARE
BEGIN
PERFORM pg_notify('watchers',
'{' ||
'"table":"' || TG_TABLE_NAME || '",' ||
'"operation":"'|| TG_OP || '",' ||
'"row":' || (select row_to_json(row)::varchar from (SELECT NEW.*) row) ||
'}'
);
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION public.notify_trigger()
OWNER TO postgres;
当我尝试使用 delete from test_notify where id = 1277
删除记录时,它 returns 出现如下错误:
ERROR: record "new" is not assigned yet
DETAIL: The tuple structure of a not-yet-assigned record is indeterminate.
CONTEXT: SQL statement "SELECT pg_notify('watchers',
'{' ||
'"table":"' || TG_TABLE_NAME || '",' ||
'"operation":"'|| TG_OP || '",' ||
'"row":' || (select row_to_json(row)::varchar from (SELECT NEW.*) row) ||
'}'
)"
PL/pgSQL function notify_trigger() line 4 at PERFORM
********** Error **********
在 test_notify
table 我有一个这样的触发器:
CREATE TRIGGER watched_table_trigger
AFTER INSERT OR UPDATE OR DELETE
ON public.test_notify
FOR EACH ROW
EXECUTE PROCEDURE public.notify_trigger();
写触发器的人显然犯了一个错误:NEW
未在 ON DELETE
触发器中定义。
最好的解决方案是删除触发器并使用 ON INSERT OR UPDATE
重新创建它。
要暂时阻止触发器触发,您可以将 session_replication_role
设置为 replica
。请注意,这也会禁用外键约束,因此只能由超级用户更改。