sql >> Databáze >  >> RDS >> PostgreSQL

Jak vytvořit trigger pro všechny tabulky v postgresql?

Neexistuje žádné vytváření spouštěčů pro celou databázi, ale pro všechny takové operace hromadného správce můžete použít systémové tabulky PostgreSQL k generování dotazů místo toho, abyste je psali ručně. V tomto případě můžete spustit:

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;

Tím získáte sadu řetězců, které jsou příkazy SQL jako:

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

Stačí je spustit najednou (buď pomocí psql nebo pgAdmin).

Nyní nějaké vysvětlení:

  • Názvy tabulek ve své databázi vybírám pomocí information_schema.tables systémová tabulka. Protože existují data doslova všech tabulek, nezapomeňte vyloučit pg_catalog a information_schema schémata a toastové tabulky z select .
  • Používám quote_ident(text) funkce, která vloží řetězec do dvojitých uvozovek ("" ) v případě potřeby (tj. názvy s mezerami nebo velkými písmeny to vyžadují).
  • Když mám seznam názvů tabulek, stačí je zřetězit s nějakými statickými řetězci, abych získal své příkazy SQL.
  • Tento příkaz píšu pomocí sub-query, protože chci, abyste získali lepší představu o tom, co se zde děje. Můžete napsat jeden dotaz vložením quote_ident(table_schema) || '.' || quote_ident(table_name) místo tab_name .



  1. Při importu do mysql z csv ponechejte speciální znaky

  2. Cizí klíč MySQL ON DELETE CASCADE přes 3 tabulky

  3. Jaký je nejlepší způsob, jak se vypořádat s DBNull's

  4. Nalezení záznamu s maximální hodnotou v SQL