PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como criar um gatilho para todas as tabelas no postgresql?


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 excluir pg_catalog e information_schema esquemas e tabelas de brinde do seu select .
  • 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 de tab_name .