我在Postgresql中有一个触发器,我不能直接开始工作(什么都不做).为了理解,我是这样定义的:

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();

现在让它更有趣一点..如何调试触发器?

推荐答案

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

    RAISE NOTICE 'myplpgsqlval is currently %', myplpgsqlval;       -- either this
    RAISE EXCEPTION 'failed';  -- or that
    
  2. 要查看实际调用了哪些触发器、调用了多少次等,请 Select 以下语句:

    EXPLAIN ANALYZE UPDATE table SET foo='bar'; -- shows the called triggers
    

    请注意,如果触发器没有被调用,并且您使用了继承,那么可能是因为您只在父表上定义了一个触发器,而子表不会自动继承触发器.

  3. 要逐步完成该功能,可以使用内置在pgAdmin3中的调试器,Windows上的调试器默认处于启用状态;您所要做的就是针对正在调试的数据库执行...\8.3\share\contrib\pldbgapi.sql中找到的代码,重新启动pgAdmin3,右键单击触发器函数,点击"Set Breakpoint",然后执行一条会触发触发器的语句,如上面的UPDATE语句.

Postgresql相关问答推荐

Trunc函数不删除小数

如何在gorm中创建一个可读但不可写的字段

如何在Windows中安装sql for golang

PostgreSQL:函数结果表内冲突(...)上的";中的字段名称

为什么在使用PostGIS时,英国郡的几何图形会出现在几内亚湾?

Gorm 中的更新将created_at、updated_at 作为默认时间

数据库所有者无法授予 Select 权限

我想优化查询SQL

使用Helm设置PostgreSQL配置

为什么在 PostgreSQL 中忽略查询超时?

如何将 JSONB 对象数组合并为 PostgreSQL 中的单个对象

使用间隔参数的 go postgres 准备好的语句不起作用

如何使用 pg_dump 或 psql 从 *.sql 恢复 PostgreSQL 表?

SQL数据库表中的多态性?

在远程机器上Restore dump

Postgres UPDATE with ORDER BY,怎么做?

如何为 Postgres psql 设置时区?

防止 PostgreSQL 中的递归触发器

Rails + Postgres fe_sendauth:no password supplied

在 OS X 上使用 Postgres.app 时如何将 psql 放在路径上?