Uma dica rápida vindo de uma pergunta no Telegram hoje de manhã: Como desativar todos os gatilhos de todas as tabelas de uma vez só?
A princípio pensei em consultar o INFORMATION SCHEMA para isso com algo como:
SQL
SELECT
'ALTER TABLE ' || event_object_schema || '.' || event_object_table ||
' DISABLE TRIGGER ' || trigger_name || ';'
FROM information_schema.triggers
GROUP BY trigger_name, event_object_schema, event_object_table;
Funciona, mas você não consegue filtrar apenas os gatilhos que estão habilitados. Então achei melhor partir para o catálogo do postgres logo de uma vez:
SQL
SELECT 'ALTER TABLE ' || n.nspname || '.' || c.relname || ' DISABLE TRIGGER ' || t.tgname || ';'
FROM
pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
JOIN pg_trigger t ON c.oid = t.tgrelid
WHERE
tgenabled = 'O' AND
NOT tgisinternal;
Note o cuidado em filtrar aqui o tipo de gatilho. Depois de desabilitar tudo, você provavelmente vai querer habilitar tudo novamente:
SQL
SELECT 'ALTER TABLE ' || n.nspname || '.' ||c.relname || ' ENABLE TRIGGER ' || t.tgname || ';'
FROM
pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
JOIN pg_trigger t ON c.oid = t.tgrelid
WHERE
tgenabled = 'D' AND
NOT tgisinternal;
Espero ter ajudado!