#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