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$
Položky v tabulkách systémového katalogu můžete procházet pomocí DO
prohlášení
. Vyžaduje Postgres 9.0 nebo novější .
Můžete také vytvořit funkci
. DO
prohlášení používá procedurální jazyk plpgsql
ve výchozím nastavení.
Jediný systémový katalog, který potřebujete, je pg_namespace
, obsahující schémata databáze. Procházet všechna schémata kromě známých systémových schémat.
Ujistěte se, že jste připojeni ke správné databázi!
Chcete-li přidat sloupec do tabulky s NOT NULL
omezení, musíte také zadat výchozí hodnotu pro vyplnění nového sloupce. Jinak logicky nemožné. Přidal jsem DEFAULT TRUE
, upravte podle svých potřeb.
Vyhněte se vkládání SQL správným citováním identifikátorů získaných z tabulek systémového katalogu. quote_ident()
v tomto případě. [Možností je více. Viz:
Potřebujete dynamické SQL. Primárním „trikem“ je pouze nastavit search_path
dynamicky, takže stejný příkaz lze spustit znovu a znovu. Účinek SET LOCAL
trvá do konce transakce. Můžete použít RESET search_path
nebo uložte předchozí stav a resetujte jej, pokud s ním potřebujete udělat více ve stejné transakci (nepravděpodobné):
SHOW search_path INTO _text_var;
...
EXECUTE 'SET search_path = ' || _text_var;