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$
Du kan gennemgå indtastningerne i systemkatalogtabeller med en DO
erklæring
. Kræver Postgres 9.0 eller nyere .
Du kan også oprette en funktion
. DO
erklæringen bruger proceduresproget plpgsql
som standard.
Det eneste systemkatalog, du har brug for, er pg_namespace
, der holder skemaerne for en database. Gennemgå alle skemaer undtagen kendte systemskemaer.
Sørg for, at du er forbundet til den rigtige database!
For at tilføje en kolonne til en tabel med en NOT NULL
begrænsning, skal du også angive en standardværdi for at udfylde den nye kolonne. Logisk umuligt ellers. Jeg tilføjede DEFAULT TRUE
, juster til dine behov.
Undgå SQL-injektion ved at citere identifikatorer, der er hentet fra systemkatalogtabeller korrekt. quote_ident()
I dette tilfælde. [Der er flere muligheder. Se:
Du har brug for dynamisk SQL. Det primære "trick" er bare at indstille search_path
dynamisk, så den samme sætning kan køres igen og igen. Effekten af SET LOCAL
varer til slutningen af transaktionen. Du kan bruge RESET search_path
eller gem den tidligere tilstand og nulstil den, hvis du skal gøre mere i samme transaktion med den (usandsynligt):
SHOW search_path INTO _text_var;
...
EXECUTE 'SET search_path = ' || _text_var;