Bem, não há criação de gatilhos em todo o banco de dados, mas para todas essas operações de administração em massa, você pode usar as tabelas do sistema PostgreSQL para gerar consultas para você em vez de escrevê-las manualmente. Nesse caso, você pode executar:
SELECT
'CREATE TRIGGER '
|| tab_name
|| ' BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();' AS trigger_creation_query
FROM (
SELECT
quote_ident(table_schema) || '.' || quote_ident(table_name) as tab_name
FROM
information_schema.tables
WHERE
table_schema NOT IN ('pg_catalog', 'information_schema')
AND table_schema NOT LIKE 'pg_toast%'
) tablist;
Isso obterá um conjunto de strings que são comandos SQL como:
CREATE TRIGGER schema1.table1 BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();
CREATE TRIGGER schema1.table2 BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();
CREATE TRIGGER schema1.table3 BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();
CREATE TRIGGER schema2.table1 BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();
CREATE TRIGGER schema2."TABLE2" BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();
...
etc
Você só precisa executá-los de uma só vez (por
psql
ou pgAdmin). Agora alguma explicação:
- Seleciono nomes de tabelas em meu banco de dados usando
information_schema.tables
tabela do sistema. Como existem dados de literalmente todas as tabelas, lembre-se de excluirpg_catalog
einformation_schema
esquemas e tabelas de brinde do seuselect
. - Eu uso
quote_ident(text)
função que irá colocar a string entre aspas duplas (""
) se necessário (ou seja, nomes com espaços ou letras maiúsculas exigem isso). - Quando tenho uma lista de nomes de tabelas, apenas as concateno com algumas strings estáticas para obter meus comandos SQL.
- Eu escrevo esse comando usando uma subconsulta porque quero que você tenha uma ideia melhor do que está acontecendo aqui. Você pode escrever uma única consulta colocando
quote_ident(table_schema) || '.' || quote_ident(table_name)
no lugar detab_name
.