sql >> Database >  >> RDS >> PostgreSQL

Voeg een kolom toe aan een tabel in alle schema's van een 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$

U kunt de items in systeemcatalogustabellen doorlopen met een DO verklaring . Vereist Postgres 9.0 of hoger .
U kunt ook een functie maken . De DO verklaring gebruikt de proceduretaal plpgsql standaard.

De enige systeemcatalogus die u nodig hebt is pg_namespace , met de schema's van een database. Loop door alle schema's behalve bekende systeemschema's.

Zorg ervoor dat je bent verbonden met de juiste database!

Een kolom toevoegen aan een tabel met een NOT NULL beperking, moet u ook een standaardwaarde opgeven om de nieuwe kolom te vullen. Logisch onmogelijk anders. Ik heb DEFAULT TRUE . toegevoegd , aanpassen aan uw behoeften.

Voorkom SQL-injectie door id's die uit systeemcatalogustabellen zijn opgehaald op de juiste manier te citeren. quote_ident() in dit geval. [Er zijn meer opties. Zie:

Je hebt dynamische SQL nodig. De primaire "truc" is om gewoon de search_path dynamisch, zodat dezelfde instructie steeds opnieuw kan worden uitgevoerd. Het effect van SET LOCAL duurt tot het einde van de transactie. U kunt RESET search_path . gebruiken of sla de vorige status op en reset deze als u er meer mee moet doen in dezelfde transactie (onwaarschijnlijk):

SHOW search_path INTO _text_var;
...
EXECUTE 'SET search_path = ' || _text_var;


  1. Hoe kan ik controleren of de ingediende datum tussen twee datums in de database ligt?

  2. Hoe MySQL 8-foutcodes te repareren:1525 en 1292?

  3. Subsidies opvragen voor een tabel in postgres

  4. opvragen voor de positie van de gebruiker in een-op-veel tabellen