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$
Vous pouvez parcourir les entrées dans les tables du catalogue système avec un DO
déclaration
. Nécessite Postgres 9.0 ou version ultérieure .
Vous pouvez également créer une fonction
. Le DO
l'instruction utilise le langage procédural plpgsql
par défaut.
Le seul catalogue système dont vous avez besoin est pg_namespace
, contenant les schémas d'une base de données. Boucle sur tous les schémas à l'exception des schémas système connus.
Assurez-vous d'être connecté à la bonne base de données !
Pour ajouter une colonne à une table avec un NOT NULL
contrainte, vous devez également fournir une valeur par défaut pour remplir la nouvelle colonne. Logiquement impossible autrement. J'ai ajouté DEFAULT TRUE
, adaptez-vous à vos besoins.
Évitez l'injection SQL en citant correctement les identificateurs extraits des tables du catalogue système. quote_ident()
dans ce cas. [Il y a plus d'options. Voir :
Vous avez besoin de SQL dynamique. La principale "astuce" consiste simplement à définir le search_path
dynamiquement, de sorte que la même instruction peut être exécutée encore et encore. L'effet de SET LOCAL
dure jusqu'à la fin de la transaction. Vous pouvez utiliser RESET search_path
ou enregistrez l'état précédent et réinitialisez-le si vous devez en faire plus dans la même transaction (peu probable) :
SHOW search_path INTO _text_var;
...
EXECUTE 'SET search_path = ' || _text_var;