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
iinformation_schema
schematy i tabele toastowe z Twojegoselect
. - 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)
zamiasttab_name
.