sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur skapar man trigger för alla tabeller i postgresql?

Tja, det finns ingen databasomfattande triggerskapande men för alla sådana bulk-admin-operationer kan du använda PostgreSQL-systemtabeller för att generera frågor åt dig istället för att skriva dem för hand. I det här fallet kan du köra:

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;

Detta kommer att få dig uppsättning strängar som är SQL-kommandon som:

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

Du behöver bara köra dem på en gång (antingen med psql eller pgAdmin).

Nu lite förklaring:

  • Jag väljer namn på tabeller i min databas med information_schema.tables systemtabell. Eftersom det finns data för bokstavligen alla tabeller, kom ihåg att utesluta pg_catalog och information_schema scheman och toast-tabeller från din select .
  • Jag använder quote_ident(text) funktion som sätter en sträng i dubbla citattecken ("" ) om det behövs (dvs namn med mellanslag eller versaler kräver det).
  • När jag har lista över tabellnamn sammanfogar jag dem bara med några statiska strängar för att få mina SQL-kommandon.
  • Jag skriver det kommandot med hjälp av sub-query eftersom jag vill att du ska få bättre uppfattning om vad som händer här. Du kan skriva en enda fråga genom att sätta quote_ident(table_schema) || '.' || quote_ident(table_name) i stället för tab_name .



  1. Använder dataskyddad med ett anpassat nyckellager från Linux

  2. Varför kan jag inte uppdatera mer än en kolumn samtidigt med hjälp av Med sökord?

  3. Hur väljer man alla poster som är 10 minuter inom nuvarande tidsstämpel i MySQL?

  4. Skapa kopia av PostgreSQL intern C-funktion och ladda den som användardefinierad funktion