【问题标题】:PostgreSQL - Use event trigger to validate a triggerPostgreSQL - 使用事件触发器来验证触发器
【发布时间】:2016-07-12 02:40:29
【问题描述】:

是否可以使用 EVENT TRIGGER 来验证 TRIGGER 定义?

我想要保证触发器在声明之后触发,在插入或更新时而不是在删除时触发,如下例所示:

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

我知道我可以使用 TG_OP、TG_WHEN 和 TG_LEVEL 检查触发器函数内部的这些参数,但这样,它只检查触发器在插入、上传或删除期间是否正确,而不是在触发器定义之后。

【问题讨论】:

  • 没有。然而,一个聪明的系统是根据预期使用的触发器函数命名,例如tf_mytable_after_iu().
  • Ziggy:嗯?为什么不能使用事件触发器?

标签: sql postgresql plpgsql ddl


【解决方案1】:

这是一个在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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    相关资源
    最近更新 更多