別スキーマのテーブルをSELECT * で参照するビュー(VIEW)を自動作成するストアドプロシージャ [SQLServer]

複数のスキーマを用意している環境で、あるスキーマのテーブルを別のスキーマから参照するビューを作成して使用することがあります。

今回は、別のスキーマのテーブルをテーブルのように参照するビューを自動生成するストアドプロシージャを作成します。

SQLServerのスキーマとは

別スキーマのテーブルを参照するビュー(VIEW)を自動作成するストアドプロシージャを作成する前に、スキーマについて簡単に記述しておきます。

SQLServerにはスキーマ(Schema)というオブジェクトが用意されています。

スキーマとは、テーブルなどのデータベース内のオブジェクトをグループ化するコンテナの名前(名前空間)です。
スキーマには権限などが設定できるので、特定のオブジェクトの権限を制御することができます。
スキーマを使用することで、ユーザーとは別の権限管理が可能になります。

スキーマはオブジェクトをグループ化する名前空間なので、スキーマが違えば同じ名前のオブジェクトを作成することができます。(1つのスキーマ内には同じ名前のオブジェクトを作成できませんが、スキーマが違えば作成できます。)

別スキーマのテーブルを参照するビュー

別スキーマのテーブルを参照するビューは、スキーマが違うテーブルのデータをテーブルのように参照するビューです。
具体的には、SELECT * FROM スキーマ名.テーブル名で別スキーマのテーブルのデータをすべて抽出するビューです。

例えば、abcというスキーマとdefというスキーマがあるとします。
abcスキーマには、TEST_TABLEという名前のテーブルを作成します。

このテーブルを別のスキーマであるdefスキーマから参照するには、以下のようなビューを作成します。

上記のような別スキーマのテーブルを参照するビューを作成する必要がある場合、テーブルの数が多くなればなるほど同じようなSQLをたくさん記述しなければなりません。
そこで、今回はそれを自動的に作成するためのストアドプロシージャを作成します。

別スキーマのテーブルをSELECT * で参照するビューを自動作成するストアドプロシージャ

スキーマとテーブルの作成

ストアドプロシージャを作成する前に、サンプルとして使用するスキーマとテーブルを作成しておきます。

今回はスキーマに「a」「b」「c」の3つを用意します。

作成するスキーマのうち、「a」を基準となるスキーマにします。

他のスキーマ(bスキーマとcスキーマ)から参照するaスキーマのテーブルとして「TABLE1」「TABLE2」「TABLE3」を作成します。

ストアドプロシージャが使用するテーブルの準備

今回作成する「別スキーマのテーブルをSELECT * で参照するビューを自動作成するストアドプロシージャ」では
①「テーブルを参照するビューの基準となるテーブルを保持するためのテーブル」

②「ビューを作成する先のスキーマを保持するためのテーブル」
を事前に作成しておいて、それを参照して処理を行います。

①「テーブルを参照するビューの基準となるテーブルを保持するためのテーブル」には、スキーマ名とテーブル名の列を用意します。

※ スキーマ名とテーブル名のサイズ(桁数)は、環境に合わせて変更してください。

このテーブルに参照元となるテーブルの情報を登録します。

REFERENCE_TABLEテーブルには、上記の3つのテーブルの情報を追加しておきます。

②「ビューを作成する先のスキーマを保持するためのテーブル」には、スキーマ名の列を用意します。

このテーブルにビューを作成するスキーマを登録します。

上記のREFERENCE_TABLEテーブルとSCHEMA_TO_CREATE_VIEWテーブルへのデータのインサートは、1回の実行で複数のレコードを挿入する形式のSQLで記述しています。
1回のINSERTで複数行のレコードをテーブルに一括で挿入する方法の詳細については、以下の記事を参照してください。

1回のINSERT(インサートSQL)で複数行のレコードを一括挿入(追加)する
SQLServerやMySQLなどのデータベースで、テーブルにレコードをINSERT文使用して追加するには、通常は以下のように記述します。 ...

ストアドプロシージャから参照するテーブルの準備ができたら、テーブルを参照するビューを作成するストアドプロシージャのSQLを記述していきます。
ストアドプロシージャでは、以下の処理を行います。

  1. プロシージャ内で使用する変数を定義します。
    変数には、「参照するテーブルのスキーマ名」「参照するテーブル名」「作成するビューのスキーマ名」を用意します。
  2. テーブルカーソルの変数を用意し、SELECT文を記述します。
    SELECT文ではREFERENCE_TABLEとビューを作成するスキーマを結合して、「参照するテーブルのスキーマ名」「参照するテーブル名」「作成するビューのスキーマ名」データを取得します。
  3. テーブルカーソルを開きます。
  4. フェッチでカーソルにレコードを読み込んでいきます。
    SELECT文で取得する結果のすべてのレコードをループで処理します。
  5. フェッチでは、「参照するテーブルのスキーマ名」「参照するテーブル名」「作成するビューのスキーマ名」の値をもとに、テーブルを「select *」で参照するビューを作成するSQL(CREATE VIEW文)を生成します。
    ビューが存在する場合にはいったん削除(DROP VIEW)するSQLも生成します。
  6. 生成したSQLを実行します。
  7. すべてのビューが作成できたらテーブルカーソルを閉じて破棄します。

上記の処理を行うストアドプロシージャのSQLを記載します。
プロシージャ名は「CREATE_TABLE_REFERENCE_VIEW」で作成します。

作成したストアドプロシージャは、以下のように実行します。

ストアドプロシージャを実行すると、ビューが作成されることが確認できます。

ストアドプロシージャで作成したテーブル参照ビュー