【发布时间】:2015-11-17 00:08:14
【问题描述】:
我不得不重新安装我的 Hyper-V Windows 服务器,所以我对我的 PostgreSQL 数据库进行了架构备份。
之后,我导入了架构备份。从表面上看,一切都很好。所有的表、函数、触发器和序列都在那里。除了由于某种原因触发器函数不再做任何事情。
我有两个触发器,这是其中之一。
CREATE TRIGGER t_update_modified
AFTER UPDATE
ON queue
FOR EACH ROW
EXECUTE PROCEDURE update_modified();
CREATE OR REPLACE FUNCTION update_modified()
RETURNS trigger AS
$BODY$BEGIN
NEW.modified = now();
Return NEW;
END;$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION update_modified()
OWNER TO postgres;
GRANT EXECUTE ON FUNCTION update_modified() TO postgres;
REVOKE ALL ON FUNCTION update_modified() FROM public;
我在代码中添加了RAISE WARNINGstatements 以检查函数是否实际执行以及它们执行了多远,我确认这些函数确实已执行并且它们一直执行到RETURN 语句。
我还添加了EXCEPTION 语句来捕获任何可能被抛出的异常,但没有这样的事情发生。
上面的函数应该更新修改的列的时间戳,但没有任何反应。我的两个触发器函数都曾经在旧虚拟机上工作。 postgres用户拥有该表的所有权限,并拥有触发函数的执行权限。
这是第二个触发器:
CREATE TRIGGER t_new_task
AFTER INSERT OR UPDATE OF status
ON queue
FOR EACH ROW
EXECUTE PROCEDURE new_task();
CREATE OR REPLACE FUNCTION new_task()
RETURNS trigger AS
$BODY$BEGIN
NOTIFY newtask;
RETURN NULL;
END;$BODY$
LANGUAGE plpgsql VOLATILE LEAKPROOF
COST 100;
ALTER FUNCTION new_task()
OWNER TO postgres;
GRANT EXECUTE ON FUNCTION new_task() TO postgres;
GRANT EXECUTE ON FUNCTION new_task() TO public;
像之前一样,NOTIFY什么都不做。连接的客户端不会收到任何通知。这也曾经在旧虚拟机上工作。
与触发器函数相关的任何内容都不会记录到日志文件中,除非我向它们添加 RAISE WARNING 语句。
我以前从未遇到过此类触发器问题。有人知道这里发生了什么吗?
我也确实重新创建了这些触发器,但这也没有解决问题。
更新:我创建了一个新数据库,只是为了测试触发器。触发器在那里也不起作用,所以这个问题影响了整个 PostgreSQL 服务器。我已经准备好拔头发了。
更新 2:重新安装 PostgreSQL 服务器并删除其数据。触发器仍然不起作用。
【问题讨论】:
-
配置项
set log_min_messages = NOTIFY; -
实际上是
notice,但是执行触发器时没有记录任何内容。好吧,除非我添加RAISE WARNING语句。
标签: postgresql