Отбросить ВСЕ триггеры из Пост-ГРЭС DB?

Там какой-либо путь состоит в том, чтобы отбросить ВСЕ триггеры от ВСЕХ таблиц в Пост-ГРЭС? Я знаю, что существует pg_trigger таблица, на которую я мог посмотреть, но не похоже, что это содержит достаточно информации для меня для дешифровки, какие триггеры я добавил к своим таблицам.

Также похоже, что ограничения Внешнего ключа обнаруживаются в pg_trigger таблице, которую я НЕ хочу отбрасывать. Я просто хочу отбросить созданный триггер пользователя от своих таблиц и сохранить FKs.

Какие-либо предложения?

14
задан JamesD 22 June 2010 в 12:46
поделиться

4 ответа

Взгляните на information_schema:

SELECT * FROM information_schema.triggers;
1
ответ дан 1 December 2019 в 09:12
поделиться

Проще всего будет pg_dump -s определения объектов и отфильтровать его для строк, начинающихся с CREATE TRIGGER.

Что-то вроде

./pg_dump -s db_name | grep '^CREATE TRIGGER' | \
  while read _ _ triggername _; do \
    echo drop trigger "$triggername;"; \
  done

(в bash) должно сработать (просмотрите его и затем запустите в базе данных).

Но, возможно, вам стоит рассмотреть alter table table_name disable trigger trigger trigger_name вместо этого.

1
ответ дан 1 December 2019 в 09:12
поделиться

Вы можете начать с этого запроса, чтобы узнать имена триггеров outr:

select * from pg_trigger t,pg_proc where
 pg_proc.oid=t.tgfoid
0
ответ дан 1 December 2019 в 09:12
поделиться

ОБНОВЛЕНИЕ: См. Реальное решение для полной функции, которую вы хотите.

Хорошо, я придумал функцию, которая делает это за меня:

CREATE OR REPLACE FUNCTION strip_all_triggers() RETURNS text AS $$ DECLARE
        triggNameRecord RECORD;
    triggTableRecord RECORD;
BEGIN
    FOR triggNameRecord IN select distinct(trigger_name) from information_schema.triggers where trigger_schema = 'public' LOOP
        SELECT distinct(event_object_table) INTO triggTableRecord from information_schema.triggers where trigger_name = triggNameRecord.trigger_name;
        RAISE NOTICE 'Dropping trigger: % on table: %', triggNameRecord.trigger_name, triggTableRecord.event_object_table;
        EXECUTE 'DROP TRIGGER ' || triggNameRecord.trigger_name || ' ON ' || triggTableRecord.event_object_table || ';';
    END LOOP;

    RETURN 'done';
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;

select strip_all_triggers();

Она отбрасывает любой триггер в вашей общедоступной схеме.

2
ответ дан 1 December 2019 в 09:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: