PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Hinzufügen einer Spalte zu einer Tabelle in allen Schemas einer PostgreSQL-Datenbank

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$

Sie können die Einträge in Systemkatalogtabellen mit einem <-Code durchlaufen>TUN Erklärung . Erfordert Postgres 9.0 oder höher .
Sie können auch eine Funktion erstellen . Das TUN -Anweisung verwendet die prozedurale Sprache plpgsql standardmäßig.

Der einzige Systemkatalog, den Sie benötigen, ist pg_namespace , die die Schemata einer Datenbank enthält. Durchlaufen Sie alle Schemas mit Ausnahme bekannter Systemschemas.

Stellen Sie sicher, dass Sie mit der richtigen Datenbank verbunden sind!

So fügen Sie einer Tabelle eine Spalte mit NOT NULL hinzu Einschränkung müssen Sie auch einen Standardwert angeben, um die neue Spalte zu füllen. Logisch anders geht es nicht. Ich habe DEFAULT TRUE hinzugefügt , an Ihre Bedürfnisse anpassen.

Vermeiden Sie SQL-Injection, indem Sie Bezeichner, die aus Systemkatalogtabellen abgerufen werden, ordnungsgemäß in Anführungszeichen setzen. quote_ident() in diesem Fall. [Es gibt weitere Optionen. Siehe:

Sie benötigen dynamisches SQL. Der primäre "Trick" besteht darin, einfach den Suchpfad dynamisch, sodass dieselbe Anweisung immer wieder ausgeführt werden kann. Die Wirkung von SET LOCAL dauert bis zum Ende der Transaktion. Sie können Suchpfad zurücksetzen verwenden oder speichern Sie den vorherigen Zustand und setzen Sie ihn zurück, wenn Sie mehr in derselben Transaktion damit machen müssen (unwahrscheinlich):

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