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$
Możesz przeglądać wpisy w tabelach katalogu systemowego za pomocą DO
oświadczenie
. Wymaga wersji Postgres 9.0 lub nowszej .
Możesz też utworzyć funkcję
. DO
oświadczenie używa języka proceduralnego plpgsql
domyślnie.
Jedynym potrzebnym katalogiem systemowym jest pg_namespace
, przechowujący schematy bazy danych. Przejdź przez wszystkie schematy z wyjątkiem znanych schematów systemowych.
Upewnij się, że masz połączenie z właściwą bazą danych!
Aby dodać kolumnę do tabeli z NOT NULL
ograniczenia, należy również podać wartość domyślną, aby wypełnić nową kolumnę. Inaczej logicznie niemożliwe. Dodałem DEFAULT TRUE
, dostosuj się do swoich potrzeb.
Unikaj wstrzykiwania SQL poprzez prawidłowe cytowanie identyfikatorów pobranych z tabel katalogu systemowego. quote_ident()
w tym przypadku. [Jest więcej opcji. Zobacz:
Potrzebujesz dynamicznego SQL. Podstawową „sztuczką” jest po prostu ustawienie search_path
dynamicznie, więc to samo stwierdzenie może być powtarzane w kółko. Efekt SET LOCAL
trwa do końca transakcji. Możesz użyć RESET search_path
lub zapisz poprzedni stan i zresetuj go, jeśli musisz zrobić z nim więcej w tej samej transakcji (mało prawdopodobne):
SHOW search_path INTO _text_var;
...
EXECUTE 'SET search_path = ' || _text_var;