2015-04-16 9 views
8

Mam wyzwalacz, ale muszę skojarzyć ze wszystkimi tabelami mojego PostgreSQL. Czy jest polecenie poniżej?Jak utworzyć wyzwalacz dla wszystkich tabel w postgresql?

CREATE TRIGGER delete_data_alldb 
BEFORE DELETE 
ON ALL DATABASE 
FOR EACH ROW 
EXECUTE PROCEDURE delete_data(); 
+0

Nie, nie ma obsługi dla wyzwalaczy w bazie danych. Dlaczego tak czy inaczej chcesz robić tę konkretną rzecz? –

+0

Potrzebuję rejestrować akcje bazy danych, aby zsynchronizować się ze smartfonem. Następnie uruchomię tabelę wyzwalacza według tabeli. Dzięki za pomoc. –

+0

@EduardoRafaelCorreadeSouza Wiem, że minęło kilka dni, odkąd zadałeś to pytanie i prawdopodobnie zrobiłeś to ręcznie. Ale sprawdź moją odpowiedź. Jeśli sprawił, że nauczysz się czegoś użytecznego, co może ci w przyszłości pomóc przy podobnym zadaniu, byłoby miło z twojej strony, gdybyś przyjął moją odpowiedź. –

Odpowiedz

8

No nie ma stworzenie wyzwalacz szerokości, ale dla wszystkich tych bulk-admin-operacji można użyć tabel systemowych PostgreSQL do generowania zapytań dla ciebie zamiast pisać je ręcznie. W tym przypadku można 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; 

To będzie Ci komplet strun, które są polecenia SQL, takich 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 uruchomić je na raz (albo psql lub pgAdmin) .

Teraz pewne wyjaśnienie:

  • wybiorę nazwy tabel w mojej bazy danych przy użyciu information_schema.tables tabeli systemowej. Ponieważ istnieją dane dotyczące dosłownie wszystkich tabel, pamiętaj, aby wykluczyć schematy i stoły z tabelami pg_catalog i information_schema ze swojego select.
  • Używam funkcji quote_ident(text), która umieszcza ciąg znaków wewnątrz podwójnego cudzysłowu (""), jeśli to konieczne (np. Nazwy ze spacjami lub dużymi literami wymagają tego).
  • Kiedy mam listę nazw tabel po prostu łączę je z pewnymi ciągami statycznymi, aby uzyskać moje polecenia SQL.
  • Piszę to polecenie, używając pod-zapytania, ponieważ chcę, żebyś miał lepsze pojęcie o tym, co tu się dzieje. Możesz napisać pojedyncze zapytanie, wstawiając quote_ident(table_schema) || '.' || quote_ident(table_name) zamiast tab_name.
+1

Mam 'subquery w FROM musi mieć alias', więc dodano') AS inner_select; 'do końca i zadziałało. –

+0

@IanVaughan dzięki, że masz 100% racji! Poprawiłem moją odpowiedź. –

Powiązane problemy