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 gå igenom posterna i systemkatalogtabeller med en DO
uttalande
. Kräver Postgres 9.0 eller senare .
Du kan också skapa en funktion
. DO
uttalandet använder procedurspråket plpgsql
som standard.
Den enda systemkatalog du behöver är pg_namespace
, som innehåller scheman för en databas. Gå igenom alla scheman utom kända systemscheman.
Se till att du är ansluten till rätt databas!
För att lägga till en kolumn i en tabell med en NOT NULL
begränsning måste du också ange ett standardvärde för att fylla den nya kolumnen. Logiskt omöjligt annars. Jag lade till DEFAULT TRUE
, anpassa efter dina behov.
Undvik SQL-injektion genom att citera identifierare som hämtats från systemkatalogtabeller korrekt. quote_ident()
I detta fall. [Det finns fler alternativ. Se:
Du behöver dynamisk SQL. Det primära "tricket" är att bara ställa in search_path
dynamiskt, så att samma uttalande kan köras om och om igen. Effekten av SET LOCAL
varar till slutet av transaktionen. Du kan använda RESET search_path
eller spara det tidigare tillståndet och återställ det om du behöver göra mer i samma transaktion med det (osannolikt):
SHOW search_path INTO _text_var;
...
EXECUTE 'SET search_path = ' || _text_var;