首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Postgres中有没有定义好的函数可以让你知道是什么动作触发了触发器?

在PostgreSQL中,可以使用特殊的内置函数来确定触发器是由什么动作触发的。这个函数是TG_OP,它返回触发器的操作类型。

TG_OP函数返回的操作类型包括以下几种:

  • INSERT:表示触发器是由INSERT操作触发的。
  • UPDATE:表示触发器是由UPDATE操作触发的。
  • DELETE:表示触发器是由DELETE操作触发的。
  • TRUNCATE:表示触发器是由TRUNCATE操作触发的。

通过在触发器中使用TG_OP函数,可以根据不同的操作类型执行相应的逻辑。例如,可以在触发器中使用条件语句来根据不同的操作类型执行不同的操作。

以下是一个示例触发器,演示了如何使用TG_OP函数来确定触发器的操作类型:

代码语言:txt
复制
CREATE OR REPLACE FUNCTION trigger_function() RETURNS TRIGGER AS $$
BEGIN
    IF TG_OP = 'INSERT' THEN
        -- INSERT操作触发的逻辑
        RAISE NOTICE 'Trigger is fired by INSERT operation';
    ELSIF TG_OP = 'UPDATE' THEN
        -- UPDATE操作触发的逻辑
        RAISE NOTICE 'Trigger is fired by UPDATE operation';
    ELSIF TG_OP = 'DELETE' THEN
        -- DELETE操作触发的逻辑
        RAISE NOTICE 'Trigger is fired by DELETE operation';
    ELSIF TG_OP = 'TRUNCATE' THEN
        -- TRUNCATE操作触发的逻辑
        RAISE NOTICE 'Trigger is fired by TRUNCATE operation';
    END IF;
    
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER my_trigger
AFTER INSERT OR UPDATE OR DELETE OR TRUNCATE ON my_table
FOR EACH ROW
EXECUTE FUNCTION trigger_function();

在上述示例中,当触发器被触发时,根据TG_OP函数返回的操作类型,会打印相应的提示信息。

对于PostgreSQL中的触发器和相关概念,可以参考腾讯云的产品文档:PostgreSQL触发器

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

postgresql 触发器 简介(转)

– 把before for each row的触发器删掉, 再测试插入 : postgres=# drop trigger tg02 on t_ret; DROP TRIGGER postgres=# drop trigger tg2 on t_ret; DROP TRIGGER postgres=# insert into t_ret values(1,’digoal’,now()); NOTICE: 00000: tg01 LOCATION: exec_stmt_raise, pl_exec.c:2840 NOTICE: 00000: tg1 LOCATION: exec_stmt_raise, pl_exec.c:2840 NOTICE: 00000: tg03, after for each row 的触发器函数返回空, 不影响后续的触发器是否被调用. 因为只要表上面发生了真正的行操作, after for each row就会被触发, 除非when条件不满足. (这个后面会讲到) LOCATION: exec_stmt_raise, pl_exec.c:2840 NOTICE: 00000: tg3 LOCATION: exec_stmt_raise, pl_exec.c:2840 NOTICE: 00000: tg04 LOCATION: exec_stmt_raise, pl_exec.c:2840 NOTICE: 00000: tg4 LOCATION: exec_stmt_raise, pl_exec.c:2840 INSERT 0 1 – 有数据插入. 这也说明了before for each statement的返回值为空并不会影响数据库对行的操作. 只有before for each row的返回值会影响数据库对行的操作. postgres=# select * from t_ret ; id | info | crt_time —-+——–+—————————- 1 | digoal | 2013-03-10 16:50:39.551481 (1 row)

02
领券