Как проверить, когда был создан триггер postgres? - PullRequest
1 голос
/ 25 апреля 2019

Как проверить, когда триггер postgres был изменен ?

Какой столбец из pg_trigger или как?

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

Если я хорошо понимаю, ваша проблема в том, что вы хотите знать, когда обновляется код вашего триггера, и фиксировать эту информацию. (например, в таблице). Что касается предыдущих модификаций, на 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.

Надеюсь, это поможет;)

1 голос
/ 25 апреля 2019

Хорошо триггер пост-хода не изменяется, он изменяет значение атрибута, к которому вы применили функцию триггера, когда вы выполняете определенные операции, такие как, BEFROE UPDATE, BEFORE INSERT, AFTER UPDATE, AFTER INSERT

...