PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Aggiungi una colonna a una tabella in tutti gli schemi di un 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$

Puoi scorrere le voci nelle tabelle del catalogo di sistema con un DO dichiarazione . Richiede Postgres 9.0 o successivo .
Puoi anche creare una funzione . Il DO istruzione utilizza il linguaggio procedurale plpgsql per impostazione predefinita.

L'unico catalogo di sistema di cui hai bisogno è pg_namespace , contenente gli schemi di un database. Esegui il ciclo di tutti gli schemi ad eccezione degli schemi di sistema noti.

Assicurati di essere connesso al database giusto!

Per aggiungere una colonna a una tabella con un NOT NULL vincolo, devi anche fornire un valore predefinito per riempire la nuova colonna. Logicamente impossibile altrimenti. Ho aggiunto DEFAULT TRUE , adatta alle tue esigenze.

Evitare l'iniezione SQL citando correttamente gli identificatori recuperati dalle tabelle del catalogo di sistema. quote_ident() in questo caso. [Ci sono più opzioni. Vedi:

Hai bisogno di SQL dinamico. Il "trucco" principale è semplicemente impostare lo search_path dinamicamente, quindi la stessa istruzione può essere ripetuta più e più volte. L'effetto di SET LOCAL dura fino alla fine della transazione. Puoi usare RESET search_path oppure salva lo stato precedente e ripristinalo se devi fare di più nella stessa transazione con esso (improbabile):

SHOW search_path INTO _text_var;
...
EXECUTE 'SET search_path = ' || _text_var;