【发布时间】:2020-05-18 11:35:05
【问题描述】:
我想创建触发器来执行函数来截断本地数据库表并插入新数据。 必须在新行插入外部数据库表后开始执行触发器。 我已经阅读了很多关于在外表上创建触发器的内容,但对我来说它不起作用。当新行将插入外部表时,触发器似乎不执行函数。似乎触发器看不到这个新的行插入事件。 我做了什么:
- 在我的本地数据库中创建了外部表,我们称之为“foreign_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(); 进行了测试:在外部数据库表“foreign_table”中插入了新行,但我看不到该表被截断并且没有插入新数据。对 foreign_tale 的插入是在外部数据库中完成的。 问题还在于测试此触发功能是否有效,手动执行会产生错误:
EXECUTE PROCEDURE reset_insert_table();错误:“执行”处或附近的语法错误 也尝试了 CALL 和 SELECT。 我为测试创建了相同的函数,但使用 'RETURNS VOID' 定义了 'RETURNS TRIGGER' 并且函数正在运行。
谁能告诉我为什么我的解决方案不起作用并且外部表上的触发器必须看到外部表中发生的事件?
【问题讨论】:
标签: postgresql function database-trigger truncate