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;