PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Tambahkan kolom ke tabel di semua skema database PostgreSQL

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;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. uWSGI, Flask, sqlalchemy, dan postgres:Kesalahan SSL:dekripsi gagal atau catatan buruk mac

  2. Apakah postgresql mendukung lookbehind regexp?

  3. PostgreSQL - Bagaimana cara memasukkan string gambar Base64 ke dalam kolom BYTEA?

  4. TAHUN memberikan kesalahan

  5. Operator PostgreSQL IN dengan kinerja buruk subquery