sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLデータベースのすべてのスキーマのテーブルに列を追加します

    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;
    


    1. 投稿配列をコンマ区切りの列値で検索します

    2. リクエストがPG::Connection#async_execでスタックする

    3. PostgreSQLの間隔値「2日」を連結する方法

    4. KubernetesでGaleraクラスターを実行する