PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Ajouter une colonne à une table dans tous les schémas d'une base de données 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$

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;