PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Adicionar uma coluna a uma tabela em todos os esquemas de um banco de dados 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$

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;