PostgreSQL

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:

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:

 

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:

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!

Leave a Reply

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.