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$
Anda dapat mengulang entri dalam tabel katalog sistem dengan DO
pernyataan
. Memerlukan Postgres 9.0 atau lebih baru .
Anda juga dapat membuat fungsi
. DO
pernyataan menggunakan bahasa prosedur plpgsql
secara default.
Satu-satunya katalog sistem yang Anda butuhkan adalah pg_namespace
, memegang skema database. Ulangi semua skema kecuali skema sistem yang diketahui.
Pastikan Anda terhubung ke database yang tepat!
Untuk menambahkan kolom ke tabel dengan NOT NULL
kendala, Anda juga harus memberikan nilai default untuk mengisi kolom baru. Secara logika tidak mungkin sebaliknya. Saya menambahkan DEFAULT TRUE
, sesuaikan dengan kebutuhan Anda.
Hindari injeksi SQL dengan mengutip pengidentifikasi yang diambil dari tabel katalog sistem dengan benar. quote_ident()
pada kasus ini. [Ada lebih banyak pilihan. Lihat:
Anda membutuhkan SQL dinamis. "Trik" utama adalah dengan hanya mengatur search_path
dinamis, sehingga pernyataan yang sama dapat dijalankan berulang-ulang. Efek dari SET LOCAL
berlaku sampai akhir transaksi. Anda dapat menggunakan RESET search_path
atau simpan status sebelumnya dan setel ulang jika Anda perlu melakukan lebih banyak dalam transaksi yang sama dengannya (tidak mungkin):
SHOW search_path INTO _text_var;
...
EXECUTE 'SET search_path = ' || _text_var;