Chà, không có việc tạo trình kích hoạt trên toàn cơ sở dữ liệu nhưng đối với tất cả các hoạt động quản trị hàng loạt như vậy, bạn có thể sử dụng bảng hệ thống PostgreSQL để tạo các truy vấn cho bạn thay vì viết chúng bằng tay. Trong trường hợp này, bạn có thể chạy:
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;
Điều này sẽ giúp bạn tập hợp các chuỗi là các lệnh SQL như:
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
Bạn chỉ cần chạy chúng cùng một lúc (bằng psql
hoặc pgAdmin).
Bây giờ một số giải thích:
- Tôi chọn tên các bảng trong cơ sở dữ liệu của mình bằng cách sử dụng
information_schema.tables
bảng hệ thống. Vì có dữ liệu của tất cả các bảng theo nghĩa đen, hãy nhớ loại trừpg_catalog
vàinformation_schema
lược đồ và bảng bánh mì nướng từselect
của bạn . - Tôi sử dụng
quote_ident(text)
hàm sẽ đặt chuỗi bên trong dấu ngoặc kép (""
) nếu cần (ví dụ:tên có khoảng trắng hoặc chữ in hoa yêu cầu điều đó). - Khi tôi có danh sách các tên bảng, tôi chỉ cần nối chúng với một số chuỗi tĩnh để nhận các lệnh SQL của mình.
- Tôi viết lệnh đó bằng truy vấn phụ vì tôi muốn bạn hiểu rõ hơn về những gì đang diễn ra ở đây. Bạn có thể viết một truy vấn bằng cách đặt
quote_ident(table_schema) || '.' || quote_ident(table_name)
thay chotab_name
.