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$
Você pode percorrer as entradas nas tabelas do catálogo do sistema com um
DO
declaração
. Requer o Postgres 9.0 ou posterior .Você também pode criar uma função . O
DO
usa a linguagem de procedimento plpgsql
por padrão. O único catálogo do sistema que você precisa é
pg_namespace
, contendo os esquemas de um banco de dados. Faça um loop em todos os esquemas, exceto esquemas de sistema conhecidos. Certifique-se de estar conectado ao banco de dados correto!
Para adicionar uma coluna a uma tabela com um
NOT NULL
restrição, você também deve fornecer um valor padrão para preencher a nova coluna. Logicamente impossível de outra forma. Adicionei DEFAULT TRUE
, ajuste às suas necessidades. Evite injeção de SQL citando identificadores recuperados das tabelas do catálogo do sistema corretamente.
quote_ident()
nesse caso. [Há mais opções. Ver:Você precisa de SQL dinâmico. O "truque" principal é apenas definir o
search_path
dinamicamente, para que a mesma instrução possa ser executada repetidamente. O efeito de SET LOCAL
dura até o final da transação. Você pode usar RESET search_path
ou salve o estado anterior e redefina-o se precisar fazer mais na mesma transação com ele (improvável):SHOW search_path INTO _text_var;
...
EXECUTE 'SET search_path = ' || _text_var;