PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm cách nào để tạo trình kích hoạt cho tất cả bảng trong postgresql?

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_cataloginformation_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 cho 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. Postgres kiểu dữ liệu ENUM hoặc KIỂM TRA CONSTRAINT?

  2. Tự động chuyển đổi dự phòng cơ sở dữ liệu Moodle PostgreSQL

  3. Nhận các phạm vi ngày liên tiếp khác nhau từ các phạm vi ngày trùng lặp

  4. Cách hợp nhất tất cả các mảng số nguyên từ tất cả các bản ghi thành một mảng duy nhất trong postgres

  5. Chèn đúng tên bảng