запуск «ТРИГГЕРА» в postgres при «ИЗМЕНЕНИИ СОБЫТИЯ`

#postgresql #triggers

#postgresql #триггеры

Вопрос:

Я хочу запускать триггер, когда в моей базовой таблице происходит событие ALTER. Я знаю, что мы можем запускать триггеры на INSERT , UPDATE , DELETE , TRUNCATE но не уверен, поддерживают ли триггеры в postgres ALTER . Любая помощь будет оценена

Ответ №1:

Да, вы ищете триггеры событий.

Чтобы создать триггер события, который будет что-то делать для определенной таблицы, вы могли бы сделать что-то вроде этого:

 CREATE TABLE public.test (a int);

CREATE FUNCTION trg_alter_test()
     RETURNS event_trigger LANGUAGE plpgsql AS $$
DECLARE
     obj record;
BEGIN
     FOR obj in SELECT * FROM pg_event_trigger_ddl_commands()
         LOOP
              -- Use the name of your table instead of public.test here
              IF obj.objid = 'public.test'::regclass THEN
                   RAISE NOTICE '% altered table: %', tg_tag, obj.objid::regclass::text;
                    END IF;
         END LOOP;
END
$$
;

CREATE EVENT TRIGGER test_trigger ON ddl_command_end WHEN TAG IN ('ALTER TABLE')
EXECUTE FUNCTION trg_alter_test();
  

Если я попытаюсь изменить public.test, я получу этот вывод:

 NOTICE:  ALTER TABLE altered table: test
ALTER TABLE
  

Очевидно, вы могли бы изменить это на все, что захотите.

Комментарии:

1. понял, спасибо, я хочу, чтобы триггер события запускался только тогда, когда в определенной таблице выполняется alter table, можете ли вы помочь мне, как это сделать, пожалуйста?

2. @abhi Я добавил пример.

3. спасибо, но в моей базе данных будет много событий ddl в течение дня …. у pg_event_trigger_ddl_commands() будут все эти события? если да, может потребоваться время для их перебора

4. Он должен был бы перебирать любые операторы ALTER TABLE.

5. чтобы быть более конкретным, мой оператор alter был бы ALTER TABLE public.emp1 INHERIT public.emp …. и имя emp1 таблицы (в основном дочерняя таблица) продолжает меняться, я хочу, чтобы триггер срабатывал, когда такой оператор alter выполняется в public.emp таблице (родительская / базовая таблица) .. могу ли я использовать регулярное выражение, подобное obj.objid = 'public.emp*'::regclass ? @Jeremy