Dav*_*ogt 26 postgresql triggers
我在Postgresql中有这个Trigger,我不能只是去工作(什么都不做).为了理解,有我如何定义它:
CREATE TABLE documents (
...
modification_time timestamp with time zone DEFAULT now()
);
CREATE FUNCTION documents_update_mod_time() RETURNS trigger
AS $$
begin
new.modification_time := now();
return new;
end
$$
LANGUAGE plpgsql;
CREATE TRIGGER documents_modification_time
BEFORE INSERT OR UPDATE ON documents
FOR EACH ROW
EXECUTE PROCEDURE documents_update_mod_time();
Run Code Online (Sandbox Code Playgroud)
现在让它更有趣..你如何调试触发器?
Kev*_*Kev 54
在触发器函数中使用以下代码,然后观察pgAdmin3中的"messages"选项卡或psql中的输出:
RAISE NOTICE 'myplpgsqlval is currently %', myplpgsqlval; -- either this
RAISE EXCEPTION 'failed'; -- or that
Run Code Online (Sandbox Code Playgroud)要查看实际调用哪些触发器,多少次等,以下语句是选择的生命保护程序:
EXPLAIN ANALYZE UPDATE table SET foo='bar'; -- shows the called triggers
Run Code Online (Sandbox Code Playgroud)
请注意,如果您的触发器不获取调用,并且使用继承,这可能是因为你只定义在父表上的触发器,而触发器不会被子表自动继承.
单步执行功能,您可以使用内置到pgAdmin3,这在Windows默认情况下启用调试; 所有你需要做的是执行中发现的代码......\8.3 \共享\的contrib\pldbgapi.sql对你调试数据库,重新启动pgAdmin3,右键单击您的触发功能,打"设置断点",然后执行一个会导致触发器触发的语句,例如上面的UPDATE语句.
原来我在上面的问题中使用了继承而忘了提及它。现在,对于可能遇到此问题的每个人,这里有一些调试提示:
使用以下代码调试触发器正在执行的操作:
RAISE NOTICE 'test'; -- either this
RAISE EXCEPTION 'failed'; -- or that
Run Code Online (Sandbox Code Playgroud)
要查看实际调用了哪些触发器、调用了多少次等,以下语句是首选:
EXPLAIN ANALYZE UPDATE table SET foo='bar'; -- shows the called triggers
Run Code Online (Sandbox Code Playgroud)
然后还有一件事我以前不知道:触发器仅在更新它们定义的确切表时触发。如果您使用继承,您也必须在子表上定义它们!
归档时间: |
|
查看次数: |
29440 次 |
最近记录: |