首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >调试postgresql触发器

调试postgresql触发器
EN

Stack Overflow用户
提问于 2008-11-20 18:54:47
回答 1查看 39.9K关注 0票数 41

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

现在为了让它更有趣..。如何调试触发器?

EN

回答 1

Stack Overflow用户

发布于 2008-11-20 19:15:38

您可以在触发器函数中使用“raise notice”语句来调试它。调试根本不被调用的触发器则是另一回事。

如果你在你的触发器函数中添加了一个'raise exception‘,你还能做插入/更新吗?

此外,如果更新测试与插入测试发生在同一个事务中,那么now()将是相同的(因为它在每个事务中只计算一次),因此更新似乎不会做任何事情。如果是这种情况,或者在单独的事务中执行它们,或者如果这是单元测试,而您不能这样做,则使用clock_timestamp()。

我有一个依赖于事务之间经过的时间的单元测试,所以在单元测试开始时,我有如下内容:

ALTER TABLE documents
   ALTER COLUMN modification_time SET DEFAULT clock_timestamp();

然后在触发器中使用"set modification_time = default“。

因此,通常它不会做额外的计算,但在单元测试期间,这允许我使用pg_sleep进行插入,以模拟时间流逝,并实际将其反映在数据中。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/306439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档