【问题标题】:How to check when postgres trigger was created?如何检查 postgres 触发器的创建时间?
【发布时间】:2019-04-24 22:29:31
【问题描述】:

如何检查 postgres 触发器何时被修改

pg_trigger 中的哪一列或如何?

【问题讨论】:

  • 不可能,Postgres 不存储该信息。

标签: postgresql ddl database-trigger


【解决方案1】:

如果我理解您的问题是您想知道触发器的代码何时更新,并捕获此信息。 (例如在表格中)。对于之前的修改,在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 FUNCTION 事件上放置另一个事件触发器。

希望这会有所帮助;)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      • 1970-01-01
      • 2019-09-08
      • 2014-02-02
      • 2017-08-02
      • 2021-08-18
      相关资源
      最近更新 更多