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
ステートメント
。 Postgres9.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;