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;