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$
Можете да преминете през записите в таблиците на системния каталог с DO
изявление
. Изисква Postgres 9.0 или по-нова версия .
Можете също да създадете функция
. DO
изразът използва процедурния език plpgsql
по подразбиране.
Единственият системен каталог, от който се нуждаете, е pg_namespace
, съдържащ схемите на база данни. Преминете през всички схеми с изключение на известните системни схеми.
Уверете се, че сте свързани с правилната база данни!
За да добавите колона към таблица с NOT NULL
ограничение, трябва също да предоставите стойност по подразбиране, за да попълните новата колона. Логически невъзможно друго. Добавих DEFAULT TRUE
, коригирайте според вашите нужди.
Избягвайте SQL инжектиране, като цитирате правилно идентификатори, извлечени от системни каталожни таблици. quote_ident()
в такъв случай. [Има още опции. Вижте:
Имате нужда от динамичен SQL. Основният „трик“ е просто да зададете search_path
динамично, така че един и същ оператор може да се изпълнява отново и отново. Ефектът от SET LOCAL
продължава до края на сделката. Можете да използвате RESET search_path
или запазете предишното състояние и го нулирайте, ако трябва да направите повече в същата транзакция с него (малко вероятно):
SHOW search_path INTO _text_var;
...
EXECUTE 'SET search_path = ' || _text_var;