我想创建触发器来执行功能以截断本地数据库表并插入新数据。在外部数据库表中插入新行之后,必须开始执行触发器。我已经阅读了很多有关在外部表上创建触发器的信息,但是对我来说,它不起作用。当将新行插入到外部表中时,触发器似乎无法执行功能。似乎触发器无法看到此新行插入事件。我做了什么:
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$;
CREATE TRIGGER local_table_update
AFTER INSERT
ON 'foreign_table'
FOR EACH ROW EXECUTE PROCEDURE reset_insert_table();
EXECUTE PROCEDURE reset_insert_table();
错误:“执行”或附近的语法错误也尝试了CALL和SELECT。我创建了用于测试的相同函数,但使用“ RETURNS VOID”定义了“ RETURNS TRIGGER”,并且该函数正常工作。谁能说出我的解决方案为什么不起作用,并且是否在外部表上触发必须看到外部表中发生的事件?
这是对外国表触发器的误解。也许是由于对外国表是的误解。
假设您有一个带有表db1
的数据库a1
,然后连接到另一个数据库db2
,并使用CREATE FOREIGN TABLE a2
创建一个指向a1
的外部表
db1
。然后,我们可以将a2
称为外部表,并且可以将a1
称为该外部表的远程表。请注意,外部表是db2
中的对象,而远程表是db1
中的对象。[现在您想要的是,只要有人修改a1
上的db1
,就在a2
上执行db2
上的触发器。但这不是触发器的工作方式:仅在执行数据修改on a2
a2
上定义的触发器。当然,由于a2
上的每个数据修改都会导致a1
上的数据修改(这反过来可能导致a1
上的触发运行)这一事实使情况变得复杂。但事实并非如此。以这种方式思考:由于a2
的定义引用了a1
,因此对a2
的每个操作都会导致对a1
的操作。但是a1
或db1
并不具有在a2
中定义db2
的最模糊的想法,因此它们没有机会向其传播更改。
您正在寻找的是logical replication,它可以将一个数据库上的所有更改复制到另一个数据库上。然后,您可以在复制的表上定义一个(副本)触发器。