PostgreSQL - 使用事件触发器来验证触发器
PostgreSQL - Use event trigger to validate a trigger
是否可以使用 EVENT TRIGGER 来验证 TRIGGER 定义?
我想要的是保证触发器在语句之后、INSERT 或 UPDATE 而不是删除时触发,如下例所示:
CREATE TRIGGER mytrigger
AFTER INSERT OR UPDATE ON mytable
FOR EACH STATEMENT
EXECUTE PROCEDURE myprocedure();
我知道我可以使用 TG_OP、TG_WHEN 和 TG_LEVEL 检查触发器函数中的那些参数,但这样一来,它只会检查触发器是否正确插入、上传或删除,而不是在触发器定义之后。
这是一个使用 trigger__parse function in cat_tools, which you can install with 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
是否可以使用 EVENT TRIGGER 来验证 TRIGGER 定义?
我想要的是保证触发器在语句之后、INSERT 或 UPDATE 而不是删除时触发,如下例所示:
CREATE TRIGGER mytrigger
AFTER INSERT OR UPDATE ON mytable
FOR EACH STATEMENT
EXECUTE PROCEDURE myprocedure();
我知道我可以使用 TG_OP、TG_WHEN 和 TG_LEVEL 检查触发器函数中的那些参数,但这样一来,它只会检查触发器是否正确插入、上传或删除,而不是在触发器定义之后。
这是一个使用 trigger__parse function in cat_tools, which you can install with 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