代码之家  ›  专栏  ›  技术社区  ›  Arthur

如何检查何时创建Postgres触发器?

  •  0
  • Arthur  · 技术社区  · 5 年前

    如何检查Postgres触发器 被改进的 ?

    pg_触发器的哪个列或如何触发?

    0 回复  |  直到 5 年前
        1
  •  1
  •   Jaisus    5 年前

    如果我理解的很好,你的问题是你想知道什么时候 代码 将更新触发器的,并捕获此信息。(例如在表格中)。对于之前的修改,PostgreSQL似乎不可能知道它。 但是,如果您对未来的修改感兴趣,那么您可以放置另一种类型的触发器:事件触发器。( https://www.postgresql.org/docs/current/event-triggers.html )

    你可以这样做:

    CREATE OR REPLACE FUNCTION [your_schema].ddl_trigger_alter_trigger_fct()
      RETURNS event_trigger
     LANGUAGE plpgsql
      AS $$
    DECLARE
        all_variables character varying;
        r RECORD;
        schema_name varchar (250);
        command_tag varchar (100);
        object_type varchar (250);
    BEGIN
        FOR r IN SELECT * FROM pg_event_trigger_ddl_commands() LOOP
            if r.schema_name = '[your_schema]' and r.command_tag = 'ALTER TRIGGER'
            then
                schema_name := r.schema_name;
                command_tag := r.command_tag;
                object_type := r.object_type;
                RAISE NOTICE 'caught % event on %', r.command_tag, r.object_identity;
                all_variables := concat(
                    'classid: ', r.classid, chr(10)
                    , 'objid: ', r.objid, chr(10)
                    , 'objsubid: ', r.objsubid, chr(10)
                    , 'command_tag: ', r.command_tag, chr(10)
                    , 'object_type: ', r.object_type, chr(10)
                    , 'schema_name: ', r.schema_name, chr(10)
                    , 'object_identity: ', r.object_identity, chr(10)
                    , 'in_extension: ', r.in_extension);
    
                RAISE NOTICE '%', all_variables;
            end if;
        END LOOP;
    
        if schema_name = '[your_schema]' and command_tag = 'ALTER TRIGGER'
        then
            -- Do what you want, for example insert a line in a table of logs
        end if;
    END;
    $$;
    
    CREATE EVENT TRIGGER ddl_trigger_alter_trigger ON ddl_command_end WHEN TAG IN ('ALTER TRIGGER')
       EXECUTE FUNCTION [your_schema].ddl_trigger_alter_trigger_fct();
    

    但是,如果您感兴趣的触发器调用了函数的代码,那么您只需要在alter函数事件上放置另一个事件触发器。

    希望这有帮助;)

        2
  •  1
  •   Sumit Srivastava    5 年前

    好吧,postgress触发器不会修改,它会修改您在执行特定操作的地方应用了trigger函数的属性值,比如, BEFROE UPDATE, BEFORE INSERT, AFTER UPDATE, AFTER INSERT