sql >> Base de Datos >  >> RDS >> PostgreSQL

Agregue una columna a una tabla en todos los esquemas de una base de datos 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$

Puede recorrer las entradas en las tablas del catálogo del sistema con un DO declaración . Requiere Postgres 9.0 o posterior .
También puede crear una función . El DO utiliza el lenguaje de procedimiento plpgsql por defecto.

El único catálogo del sistema que necesita es pg_namespace , que contiene los esquemas de una base de datos. Recorra todos los esquemas excepto los esquemas de sistema conocidos.

¡Asegúrate de estar conectado a la base de datos correcta!

Para agregar una columna a una tabla con NOT NULL restricción, también debe proporcionar un valor predeterminado para llenar la nueva columna. Lógicamente imposible de otra manera. Agregué DEFAULT TRUE , ajústese a sus necesidades.

Evite la inyección SQL citando correctamente los identificadores recuperados de las tablas del catálogo del sistema. quote_ident() en este caso. [Hay más opciones. Ver:

Necesita SQL dinámico. El "truco" principal es simplemente establecer el search_path dinámicamente, por lo que la misma declaración se puede ejecutar una y otra vez. El efecto de SET LOCAL dura hasta el final de la transacción. Puedes usar RESET search_path o guarde el estado anterior y reinícielo si necesita hacer más en la misma transacción (poco probable):

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