У меня есть несколько триггеров, все они являются одним и тем же триггером, но в разных таблицах, например.
tgname | trigger_table
------------------------+----------------------------------
updated_agg_trigger | forecasts.forecast_1548180000
updated_agg_trigger | forecasts.forecast_1548187200
updated_agg_trigger | forecasts.forecast_1548162000
updated_agg_trigger | forecasts.forecast_1548190800
updated_agg_trigger | forecasts.forecast_1548183600
updated_agg_trigger | forecasts.forecast_1548172800
updated_agg_trigger | forecasts.forecast_1548111600
updated_agg_trigger | forecasts.forecast_1548136800
updated_agg_trigger | forecasts.forecast_1548129600
Как удалить все updated_agg_trigger
-триггеры на всех таблицах одной командой?
P.S. Я не хочу удалять ВСЕ триггеры, только updated_agg_trigger
-триггеры.
Запустите цикл динамического оператора через information_schema.triggers
.
DO $$
DECLARE
l_trig_name TEXT := 'updated_agg_trigger';
l_schema TEXT := 'forecasts';
rec record;
BEGIN
for rec IN
(
SELECT event_object_table as table_name
,trigger_schema as schema_name
,trigger_name
FROM information_schema.triggers
WHERE trigger_name = l_trig_name
AND trigger_schema = l_schema
)
LOOP
EXECUTE format ('DROP TRIGGER %I
ON %I.%I', rec.trigger_name,rec.schema_name,rec.table_name);
END LOOP;
END $$;
Думал, что это сработало, но это не так. Я получаю ОШИБКУ: отношение «прогноз_1548180000» не существует КОНТЕКСТ: оператор SQL «DROP TRIGGER updated_agg_trigger ON прогноз_1548180000»
Итак, мне просто нужно было добавить схему в формате DROP TRIGGER...
, т.е. EXECUTE format ('DROP TRIGGER %I ON forecasts.%I', l_trig_name,rec.table_name);
@Jesper: Да, это тоже была моя ошибка. Я изменил свой код, который стал более обобщенным.