PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak stworzyć wyzwalacz dla wszystkich tabel w postgresql?

Cóż, nie ma tworzenia wyzwalaczy dla całej bazy danych, ale dla wszystkich takich masowych operacji administracyjnych możesz użyć tabel systemowych PostgreSQL do generowania zapytań zamiast pisać je ręcznie. W tym przypadku możesz uruchomić:

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;

Otrzymasz zestaw ciągów, które są poleceniami SQL, takimi jak:

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

Wystarczy je uruchomić od razu (albo przez psql lub pgAdmin).

Teraz kilka wyjaśnień:

  • Wybieram nazwy tabel w mojej bazie danych za pomocą information_schema.tables tabela systemowa. Ponieważ istnieją dane dosłownie wszystkich tabel, pamiętaj, aby wykluczyć pg_catalog i information_schema schematy i tabele toastowe z Twojego select .
  • Używam quote_ident(text) funkcja, która wstawi ciąg znaków w cudzysłów ("" ) w razie potrzeby (np. nazwy ze spacjami lub wielkimi literami tego wymagają).
  • Kiedy mam listę nazw tabel, po prostu łączę je ze statycznymi ciągami, aby uzyskać moje polecenia SQL.
  • Piszę to polecenie za pomocą podzapytania, ponieważ chcę, abyś miał lepsze pojęcie o tym, co się tutaj dzieje. Możesz napisać pojedyncze zapytanie, umieszczając quote_ident(table_schema) || '.' || quote_ident(table_name) zamiast tab_name .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd podczas instalacji psycopg2==2.6.2

  2. Postgres LEFT JOIN z SUM, brakujące rekordy

  3. PG::Błąd w klauzuli GROUP BY

  4. Aktualizacje oparte na niestandardowych wyzwalaczach dla PostgreSQL

  5. Skrypt powłoki do wykonywania poleceń pgsql w plikach