sql >> Databasteknik >  >> RDS >> PostgreSQL

Lägg till en kolumn i en tabell i alla scheman i en PostgreSQL-databas

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;


  1. Hur lägger till unik nyckel till befintlig tabell (med icke-unika rader)

  2. Doctrine 2 DQL CASE WHEN in Count

  3. Microsoft Access vs SQL Server

  4. Fjäderanslutningsproblem