PostgreSQL-使用事件触发器来验证触发器

利扎多

是否可以使用事件触发来验证触发定义?

我想要的是保证在STATEMENT之后在INSERT或UPDATE而不是Delete上触发触发器,例如以下示例:

CREATE TRIGGER mytrigger
   AFTER INSERT OR UPDATE ON mytable
   FOR EACH STATEMENT
   EXECUTE PROCEDURE myprocedure();

我知道我可以使用TG_OP,TG_WHEN和TG_LEVEL在触发器函数中检查那些参数,但是通过这种方式,它仅在插入,上载或删除期间检查触发器是否正确,而不是在触发器定义之后立即检查。

吉姆·纳斯比

这是一个使用cat_tools中trigger__parse函数的示例,可以将其与pgxnclient一起安装

首先,一些常规设置:

CREATE EXTENSION cat_tools;
CREATE TABLE i(i int);

创建实际的事件触发器:

CREATE OR REPLACE FUNCTION no_before_triggers() RETURNS event_trigger LANGUAGE plpgsql AS $body$
DECLARE
  r record;
BEGIN
  FOR r IN SELECT * FROM pg_event_trigger_ddl_commands()
  LOOP
    IF (cat_tools.trigger__parse(r.objid)).timing = 'BEFORE' THEN
        RAISE 'before triggers not allowed';
    END IF;
  END LOOP;
END$body$;

最后,尝试创建一个BEFORE触发器,看看它是否失败:

CREATE TRIGGER dummy BEFORE INSERT ON i EXECUTE PROCEDURE tg_dummy();
ERROR:  before triggers not allowed

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章