DO
$do$
DECLARE
_schema text;
_sp
BEGIN
FOR _schema IN
SELECT quote_ident(nspname) -- prevent SQL injection
FROM pg_namespace n
WHERE nspname !~~ 'pg_%'
AND nspname <> 'information_schema'
LOOP
EXECUTE 'SET LOCAL search_path = ' || _schema;
ALTER TABLE product ADD COLUMN show_price boolean NOT NULL DEFAULT TRUE;
END LOOP;
END
$do$
Bạn có thể lặp lại các mục trong bảng danh mục hệ thống bằng mã <> LÀM tuyên bố
. Yêu cầu Postgres 9.0 trở lên .
Bạn cũng có thể tạo một hàm
. DO
câu lệnh sử dụng ngôn ngữ thủ tục plpgsql
theo mặc định.
Danh mục hệ thống duy nhất bạn cần là pg_namespace
, nắm giữ các lược đồ của cơ sở dữ liệu. Lặp qua tất cả các lược đồ ngoại trừ các lược đồ hệ thống đã biết.
Đảm bảo rằng bạn được kết nối với cơ sở dữ liệu phù hợp!
Để thêm cột vào bảng có mã NOT NULL
ràng buộc, bạn cũng phải cung cấp một giá trị mặc định để điền vào cột mới. Về mặt logic thì không thể khác được. Tôi đã thêm DEFAULT TRUE
, điều chỉnh theo nhu cầu của bạn.
Tránh chèn SQL bằng cách trích dẫn các số nhận dạng được truy xuất từ các bảng danh mục hệ thống đúng cách. quote_ident ()
trong trường hợp này. [Có nhiều lựa chọn hơn. Xem:
Bạn cần SQL động. "Thủ thuật" chính là chỉ đặt search_path
động, vì vậy có thể chạy đi chạy lại cùng một câu lệnh. Tác dụng của ĐẶT VỊ TRÍ
kéo dài cho đến khi kết thúc giao dịch. Bạn có thể sử dụng RESET search_path
hoặc lưu trạng thái trước đó và đặt lại nếu bạn cần thực hiện nhiều thao tác hơn trong cùng một giao dịch với nó (không chắc):
SHOW search_path INTO _text_var;
...
EXECUTE 'SET search_path = ' || _text_var;