sql >> Database teknologi >  >> RDS >> PostgreSQL

Tilføj en kolonne til en tabel i alle skemaer i en PostgreSQL-database

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;


  1. Indsæt ny række med data beregnet fra andre rækker

  2. Bulk indsæt med SQLAlchemy ORM

  3. Hvordan får jeg deltaet for user_id siden de foregående måneder ved hjælp af oracle sql

  4. Dynamisk minimumsværdi for specifikt område (mysql)