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;