Desabilitando todos os gatilhos do PostgreSQL

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!

Compartilhe

Você pode gostar

Sobre minha saída da Timbira

Há 14 anos, durante o PGConf.Brasil 2009, lá na UNICAMP em Campinas/SP, 4 pessoas se reuniram e idealizaram a criação da primeira empresa dedicada exclusivamente

Split brain

Já tem algum tempo que eu pensava em fazer isso e chegou a hora. Este blog vai se dividir em 2 partes a partir de

plugins premium WordPress