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;