调试postgresql触发器

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

  1. 在触发器函数中使用以下代码,然后观察pgAdmin3中的"messages"选项卡或psql中的输出:

    RAISE NOTICE 'myplpgsqlval is currently %', myplpgsqlval;       -- either this
    RAISE EXCEPTION 'failed';  -- or that
    
    Run Code Online (Sandbox Code Playgroud)
  2. 要查看实际调用哪些触发器,多少次等,以下语句是选择的生命保护程序:

    EXPLAIN ANALYZE UPDATE table SET foo='bar'; -- shows the called triggers
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,如果您的触发器不获取调用,并且使用继承,这可能是因为你只定义在父表上的触发器,而触发器不会被子表自动继承.

  3. 单步执行功能,您可以使用内置到pgAdmin3,这在Windows默认情况下启用调试; 所有你需要做的是执行中发现的代码......\8.3 \共享\的contrib\pldbgapi.sql对你调试数据库,重新启动pgAdmin3,右键单击您的触发功能,打"设置断点",然后执行一个会导致触发器触发的语句,例如上面的UPDATE语句.


Dav*_*ogt 6

原来我在上面的问题中使用了继承而忘了提及它。现在,对于可能遇到此问题的每个人,这里有一些调试提示:

使用以下代码调试触发器正在执行的操作:

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)

然后还有一件事我以前不知道:触发器仅在更新它们定义的确切表时触发。如果您使用继承,您也必须在子表上定义它们!