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;