Postgresql:触发外部 table 执行函数 truncate/insert 到本地 table
Postgresql: trigger on foreign table to execute function to truncate/insert into local table
我想创建触发器来执行函数以截断本地数据库 table 并插入新数据。
触发器执行必须在新行插入外部数据库 table 后开始。
我已经阅读了很多关于在外国 table 上创建触发器的内容,但对我来说它不起作用。当新行将插入外部 table 时,触发器似乎不执行函数。触发器似乎看不到这个新行插入事件。
我做了什么:
- 在我的本地数据库中创建了外国 table,我们称之为 'foreign_table'。我测试了,可以读取数据。
已创建截断本地 table 并插入新数据的函数:
CREATE or replace FUNCTION public.reset_insert_table()
RETURNS TRIGGER
LANGUAGE 'plpgsql'
SET search_path=public
AS $BODY$
BEGIN
create temporary table temporary_table_tmp
as select * from public.table1;
TRUNCATE TABLE public.table2;
insert into table2
select * from temporary_table_tmp;
DROP table temporary_table_tmp;
END;
$BODY$;
已创建启动函数的触发器'reset_insert_table()'
CREATE TRIGGER local_table_update
AFTER INSERT
ON 'foreign_table'
FOR EACH ROW EXECUTE PROCEDURE reset_insert_table();
进行了测试:在外部数据库table 'foreign_table'中插入了新行,但是我看不到table被截断并且没有插入新数据。 foreign_tale 的插入是在外部数据库中完成的。
问题还在于测试此触发功能是否有效,手动执行会产生错误:
EXECUTE PROCEDURE reset_insert_table();
错误:"execute" 处或附近的语法错误
还尝试了 CALL 和 SELECT。
我为测试创建了相同的函数,但定义了'RETURNS TRIGGER'used 'RETURNS VOID' 并且函数正在运行。
谁能告诉我为什么我的解决方案不起作用并且在外国 tables 上触发必须看到在外国 tables 发生的事件?
根据您的评论,您似乎正在使用逻辑复制。
虽然数据修改在具有逻辑复制的备用数据库上重放,但参数 session_replication_role
设置为 replica
以防止触发器和外键约束起作用。
如果您希望通过逻辑复制重放数据来触发触发器,您必须将其声明为副本触发器:
ALTER TABLE a2 ENABLE REPLICA TRIGGER trigger_name;
我想创建触发器来执行函数以截断本地数据库 table 并插入新数据。 触发器执行必须在新行插入外部数据库 table 后开始。 我已经阅读了很多关于在外国 table 上创建触发器的内容,但对我来说它不起作用。当新行将插入外部 table 时,触发器似乎不执行函数。触发器似乎看不到这个新行插入事件。 我做了什么:
- 在我的本地数据库中创建了外国 table,我们称之为 'foreign_table'。我测试了,可以读取数据。
已创建截断本地 table 并插入新数据的函数:
CREATE or replace FUNCTION public.reset_insert_table() RETURNS TRIGGER LANGUAGE 'plpgsql' SET search_path=public AS $BODY$ BEGIN create temporary table temporary_table_tmp as select * from public.table1; TRUNCATE TABLE public.table2; insert into table2 select * from temporary_table_tmp; DROP table temporary_table_tmp; END; $BODY$;
已创建启动函数的触发器'reset_insert_table()'
CREATE TRIGGER local_table_update AFTER INSERT ON 'foreign_table' FOR EACH ROW EXECUTE PROCEDURE reset_insert_table();
进行了测试:在外部数据库table 'foreign_table'中插入了新行,但是我看不到table被截断并且没有插入新数据。 foreign_tale 的插入是在外部数据库中完成的。 问题还在于测试此触发功能是否有效,手动执行会产生错误:
EXECUTE PROCEDURE reset_insert_table();
错误:"execute" 处或附近的语法错误 还尝试了 CALL 和 SELECT。 我为测试创建了相同的函数,但定义了'RETURNS TRIGGER'used 'RETURNS VOID' 并且函数正在运行。
谁能告诉我为什么我的解决方案不起作用并且在外国 tables 上触发必须看到在外国 tables 发生的事件?
根据您的评论,您似乎正在使用逻辑复制。
虽然数据修改在具有逻辑复制的备用数据库上重放,但参数 session_replication_role
设置为 replica
以防止触发器和外键约束起作用。
如果您希望通过逻辑复制重放数据来触发触发器,您必须将其声明为副本触发器:
ALTER TABLE a2 ENABLE REPLICA TRIGGER trigger_name;