Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

CREATE VIEW

ビューを作成します。

Synopsis

CREATE [OR REPLACE] VIEW view-name [(column-commalist)]
       AS select-statement 
       [ WITH READ ONLY  |  WITH [level] CHECK OPTION ]

引数

view-name 作成するビューの名前テーブル名と同様の追加の名前付け制約に従う、有効な識別子です。ビュー名は修飾 (schema.viewname)、未修飾のどちらでもかまいません。同じスキーマ内では、テーブルとビューに同じ名前を使用することはできません。
column-commalist オプション — ビューを構成する列名。1 つ以上の有効な識別子です。指定する場合、このリストは括弧で囲み、リスト内の項目はコンマで区切ります。
AS select-statement ビューを定義する SELECT 文。
WITH READ ONLY オプション — このビューの基になっているテーブルに対して、このビューからは挿入、更新、削除の各操作を実行できないように指定します。既定では、後述の制限を条件として、ビュー経由でこれらの操作が許可されます。
WITH level CHECK OPTION オプション — このビューの基になっているテーブルに対して、挿入、更新、削除の各操作をこのビューからどのように実行するかを指定します。level には、キーワード LOCAL または CASCADED を指定できます。level を指定しない場合、WITH CHECK OPTION は既定で CASCADED になります。

概要

CREATE VIEW コマンドは、ビューの内容を定義します。ビューを定義する SELECT 文は、複数のテーブルや他のビューを参照できます。

特権

作成するビューの SELECT 節内から参照するオブジェクトを選択するには、適切な特権が必要です。

  • ダイナミック SQL または xDBC を使用してビューを作成する場合、そのビューで参照する基本テーブル (またはビュー) から選択するすべての列に対して SELECT 特権が必要です。指定したテーブル (またはビュー) に対する SELECT 特権を持っていない場合は、CREATE VIEW コマンドを実行できません。

    ただし、定義したビューを投影するクラスのコンパイル時には、これらの SELECT 特権は、ビューで参照する基本テーブル (またはビュー) から選択した列に対して強制されません。例えば、特権ルーチン (これらの SELECT 特権を持つ) を使用してビューを作成する場合、後でビュー・クラスをコンパイルできます。ビューで参照されるテーブルに対する SELECT 特権があるかどうかにかかわらず、ビューの所有者であるためです。

  • ビューに対する SELECT 特権の WITH GRANT OPTION を取得するには、ビューが参照するすべてのテーブル (またはビュー) について WITH GRANT OPTION を持っていなければなりません。

  • ビューについて INSERT、UPDATE、DELETE、または REFERENCES 特権を取得するには、ビューが参照するすべてのテーブル (またはビュー) に対して同じ特権を持っている必要があります。これらの特権の WITH GRANT OPTION を取得するには、基になるテーブルに対して WITH GRANT OPTION 特権を持っている必要があります。

  • ビューが WITH READ ONLY に指定されていると、基本テーブルに対する特権を持っていてもそのビューに対しての INSERT、UPDATE、または DELETE 特権は認められません。後でビューが読み取り/書き込み可能に再定義されると、ビューに投影されているクラスがリコンパイルされるときにこれらの特権が追加されます。

%CHECKPRIV コマンドを呼び出すことにより、現在のユーザがこれらのテーブルレベルの特権を持っているかどうかを確認できます。$SYSTEM.SQL.CheckPriv()Opens in a new tab メソッドを呼び出すことにより、指定のユーザがこれらのテーブルレベルの特権を持っているかどうかを確認できます。特権の割り当てについては、"GRANT" コマンドを参照してください。

ビューがコンパイルされると、ビューの作成者 (所有者) に %ALTER 特権の WITH GRANT OPTION が与えられます。

CREATE VIEW コマンドの実行には特権が必要です。CREATE VIEW を使用する前に、%CREATE_VIEW 特権を得る必要があります。特権がない場合は、SQLCODE -99 エラー (特権違反) が返されます。適切な付与特権を持っていれば、GRANT コマンドを使用して、%CREATE_VIEW 特権を割り当てることができます。

埋め込み SQL では、以下のように $SYSTEM.Security.Login()Opens in a new tab メソッドを使用して適切な特権を持ったユーザとしてログインできます。

   DO $SYSTEM.Security.Login("_SYSTEM","SYS")
   &sql(      )

$SYSTEM.Security.Login メソッドを呼び出すには、%Service_Login:Use 特権が必要です。詳細は、"インターシステムズ・クラス・リファレンス" の "%SYSTEM.SecurityOpens in a new tab" を参照してください。

%CREATE_VIEW 特権は GRANT コマンドで割り当てます。このときユーザまたはロールにこの特権を割り当てる必要があります。この要件は設定可能です。

既定値は “はい” (1) です。“はい” の場合、ユーザは特権が付与されているテーブルやビューのみでアクションを実行できます。この設定を推奨します。

このオプションが “いいえ” (0) に設定された場合、この設定の変更後に開始された新しいプロセスすべてで SQL セキュリティは無効になります。つまり、特権ベースのテーブルやビューのセキュリティは抑制されていることを意味します。ユーザを指定しなくてもテーブルの作成が可能になります。この場合、ダイナミック SQL はユーザとして “_SYSTEM” を、埋め込み SQL はユーザとして "" (空文字列) を割り当てます。ユーザは特権がなくてもテーブルやビューに対してアクションを実行することができます。

ビューの名前付け規約

ビュー名の名前付け規約はテーブル名と同じで、同じ名前セットを共有します。そのため、同じスキーマ内でテーブルとビューに同じ名前を使用することはできません。これを実行しようとすると、SQLCODE -201 エラーが返されます。同じ名前を持つテーブル定義およびビュー定義を投影するクラスでも、SQLCODE -201 エラーが生成されます。

ビュー名は、識別子の規則に従い、以下のような制約を受けます。既定のビュー名は、簡単な識別子です。ビュー名は 128 文字を超えることはできません。ビュー名は、大文字と小文字が区別されません。詳細は、"Caché SQL の使用法" の “識別子” の章を参照してください。

Caché はビュー名を使用して、対応するクラス名を生成します。クラス名には英数字 (文字および数字) のみを使用し、最初の 96 文字は一意である必要があります。このクラス名を生成するために、Caché は最初にビュー名から句読点を削除し、次に最初の 96 文字が一意である識別子を生成します。その際、クラス名の一意性を維持するために、必要に応じて最後の文字を (0 で始まる) 整数に置き換えます。Caché は有効なビュー名から一意のクラス名を生成しますが、ビューの名前を付ける際には、この名前の生成に伴う以下の制約について考慮する必要があります。

  • ビュー名には、最低でも 1 文字を含める必要があります。ビュー名の先頭の文字または最初の句読点に続く文字は、数字以外の文字にする必要があります。

  • Caché は Unicode システムで、16 ビット (ワイド) 文字のビュー名をサポートします。$ZNAME テストに合格した文字は、有効な文字です。

  • ビュー名の最初の文字が句読点文字の場合、2 番目の文字に数字を指定することはできません。これにより、SQLCODE -400 エラーが発生し、生成される %msg の値は “エラー #5053 : クラス名 'schema.name' が無効です” になります (句読点文字なし)。例えば、指定したビュー名が %7A の場合、生成される %msg は “エラー #5053 : クラス名 'User.7A' が無効です” になります。

  • 生成されたクラス名には句読点が含まれないため、句読点のみ既存のビュー名またはテーブル名と異なるビュー名を作成することは可能ですが、お勧めできません。この場合、Caché は、一意のクラス名を作成するために名前の最後の文字を (0 で始まる) 整数に置き換えます。

  • ビュー名は 96 文字よりも大幅に長くすることができますが、最初の 96 の英数字が異なるようにビュー名を作成すると処理がはるかに容易になります。

ビュー名は修飾、未修飾のどちらでもかまいません。修飾付きのビュー名には、以下の構文を使用します。

schema.viewname

修飾付きのビュー名は、既存のスキーマまたは新規スキーマを指定できます。新規スキーマを指定する場合、システムがそのスキーマを作成します。

未修飾のビュー名には、既定として SQLUser スキーマ (または事前構成されたシステム既定のスキーマ名) が使用されます。Caché はスキーマ名を使用して、対応するクラス・パッケージ名を生成します。SQLUser からは、パッケージ名 User が生成されます。スキーマ名と既定値の詳細は、"Caché SQL の使用法" の “テーブルの定義” の章を参照してください。

既存のビュー

指定のビューが現在のネームスペースに既に存在するかどうかを確認するには、$SYSTEM.SQL.ViewExists()Opens in a new tab メソッドを使用します。

既存のビューと同じ名前のビューを作成しようとしたときの反応は、オプションの OR REPLACE キーワードおよび構成設定により異なります。

OR REPLACE を指定する場合

CREATE OR REPLACE VIEW を指定すると、SELECT 節で指定されたビュー定義、および指定された任意の WITH READ ONLY または WITH CHECK OPTION によって既存のビューが置き換えられます。これは該当する ALTER VIEW 文を実行することと同じです。元のビューに付与されていた特権はすべて残ります。

このキーワード句の機能はすべて ALTER VIEW で使用できます。このキーワード句は Oracle SQL コードとの互換性のために用意されたものです。

OR REPLACE を指定しない場合

CREATE VIEW を指定すると、既定では、既存のビューと同じ名前のビューを作成しようとしても拒否され、SQLCODE -201 エラーが発行されます。この動作は構成可能です。この動作を変更すると、CREATE VIEWCREATE TABLE の両方に影響します。この動作は次のように構成できます。

  • $SYSTEM.SQL.SetDDLNo201()Opens in a new tab メソッド呼び出し。現在の設定を確認するには、$SYSTEM.SQL.CurrentSettings()Opens in a new tab を呼び出します。これにより、[SQLCODE=-201 エラーの抑制] の設定が表示されます。

  • 管理ポータルに進み、システム, 構成, 一般SQL設定 を選択します。[既存テーブルに対して DDL の CREATE TABLE または CREATE VIEW を許可] の現在の設定を表示します。

既定値は “いいえ” (0) です。ここでは、この設定を推奨します。このオプションを “はい” (1) に設定すると、Caché はこのビューに対応するクラス定義を削除し、クラスを再作成します。これは、DROP VIEW を実行してから CREATE VIEW を実行するのとほぼ同じです。

列名

ビューには括弧で囲まれた列名のリスト column-commalist をオプションで含めることができます。このような列名を指定すると、そのビューを使用する際には、この名前を使用して列のデータへのアクセスや列のデータの表示が行われます。列名のリストを省略した場合は、SELECT のソース・テーブルの列名が使用されます。列名のリストを省略する場合は、括弧も省略する必要があります。

column-commalist を指定する場合は、以下の条件が適用されます。

  • 単一のフィールドを指定する場合でも、列名のリストでは括弧を指定する必要があります。複数の列名はコンマで区切る必要があります。column-commalist 内では空白およびコメントを使用できます。

  • 列名の数は SELECT 文で指定したフィールドの数と一致する必要があります。 ビューとクエリとで列数が一致していない場合は、コンパイル時に SQLCODE -142 エラーが発生します。

  • 列名は有効な識別子である必要があります。列名には SELECT のフィールド名と異なる名前、同じ名前、あるいはこの両方を組み合わせて指定できます。指定するビューの列名の順序と SELECT のフィールド名の順序は一致させます。ビューの列に対して無関係の SELECT フィールドの名前を割り当てることができるため、ビューの列名を割り当てる際には注意が必要です。

以下の例は、ビューとクエリで列が一致するときの CREATE VIEW を示しています。

CREATE VIEW MyView (ViewCol1, ViewCol2, ViewCol3) AS
     SELECT TableCol1, TableCol2, TableCol3 
     FROM MyTable

また、クエリで AS キーワードを使ってビュー列をクエリ列 (またはビュー列のペア) として関連付けることもできます。以下はその例です。

CREATE VIEW MyView AS 
  SELECT TableCol1 AS ViewCol1,
     TableCol2 AS ViewCol2,
     TableCol3 AS ViewCol3
     FROM MyTable

SELECT 節の考慮事項

ビューは、特定のテーブルの行や列の単純なサブセットである必要はありません。ビューは、任意の複雑度を持つ SELECT 節で、複数のテーブルや他のビューを使用して作成できます。ただし、ビュー定義に使用する SELECT 節には、いくつかの制約があります。CREATE VIEW 文には、以下の内容が適用されます。

  • ORDER BY 節は TOP 節と組み合わせた場合にのみ含めることができます。ビュー内のすべての行を含める場合は、TOP ALL 節を使用します。TOP 節は ORDER BY 節を指定しなくても含めることができます。ただし、TOP 節を使用せずに ORDER BY 節を含めると、SQLCODE -143 エラーが生成されます。ORDER BY 節を使用したクエリを持つビュー・クラスの SQL ビューを投影すると、ビュー・プロジェクションではその ORDER BY 節が無視されます。

  • ホスト変数INTO キーワードを含まない。SELECT 節でホスト変数を参照しようとすると、システムにより、SQLCODE -148 エラーが生成されます。

  • 臨時のテーブルを参照しない

  • GROUP BY 節を持つことが可能

  • 関数を使用可能

CREATE VIEW には、2 つのテーブルの UNION 結合から列を選択する UNION 文を含めることができます。以下の埋め込み SQL の例のように、UNION を指定することができます。

  DO $SYSTEM.Security.Login("_SYSTEM","SYS")
  &sql(CREATE VIEW MyView (vname,vstate) AS
  SELECT t1.name,t1.home_state
    FROM Sample.Person AS t1
  UNION
  SELECT t2.name,t2.office_state
    FROM Sample.Employee AS t2)
  IF SQLCODE=0 { WRITE !,"Created view" }
  ELSE { WRITE "CREATE VIEW error SQLCODE=",SQLCODE }

上記の例のように、ビュー名が未修飾の場合は、ビューによって参照されるテーブルが Sample スキーマに属していたとしても、システム全体の既定 SQL スキーマ名 (この場合は User.MyView) が既定のスキーマになることに注意してください。ビューを関連するテーブルと共に確実に格納するために、ビュー名は常に修飾付きにすることをお勧めします。

View ID : %vid

ビューを使用してデータにアクセスする際に、Caché では、そのビューによって返される行のそれぞれに、連続した整数のビュー ID (%vid) が割り当てられます。テーブル行の ID 番号と同様、これらのビューの行 ID 番号は、システムによって割り当てられる一意の非ゼロ、非 NULL 値で、変更することはできません。この %vid は、通常は非表示です。テーブル行 ID とは異なり、アスタリスク構文の使用時には表示されません。表示されるのは、SELECT で明示的に指定された場合のみです。%vid を使用すると、ビューにアクセスする SELECT で返される行の数をさらに制限することができます。%vid の使用の詳細は、"Caché SQL の使用法" の “ビューの定義と使用” の章を参照してください。

ビュー経由の更新

ビューを使用して、ビューの基であるテーブルの更新が可能です。ビュー経由で、新しい行の INSERT による挿入、行データの UPDATE による更新、および、行の DELETE による削除が可能です。CREATE VIEW 文にこの機能を指定していれば、INSERT 文、UPDATE 文、DELETE 文をビューに発行できます。ビューを使用した更新を許可するには、ビューの定義時に WITH CHECK OPTION (既定) を指定します。

ビュー経由の更新を禁止するには、WITH READ ONLY を指定します。WITH READ ONLY で作成されるビューで INSERTUPDATE、または DELETE を実行すると、SQLCODE = -35 エラーが生成されます。

ビュー経由の更新を実行するには、GRANT コマンドによって、テーブルやビューの更新に対応する特権を指定することが必要です。

ビュー経由で更新するには、以下の制限に従います。

  • ビューは、ビューとして投影されたクラス・クエリではありません。

  • ビューのクラスはクラス・パラメータ READONLY=1 を含むことはできません。

  • ビューの SELECT 文は DISTINCT、TOP、GROUP BY、または HAVING 節を含むことはできず、UNION の一部にはできません。

  • ビューの SELECT 文はサブクエリを含むことはできません。

  • ビューの SELECT 文は、列参照である値式だけをリストします。

  • ビューの SELECT 文には 1 つのテーブル参照のみを含めることができます。select-list や WHERE 節に FROM 節、JOIN 構文、または 矢印構文を含めることはできません。テーブル参照は、更新可能なテーブルまたは更新可能なビューのいずれかを指定する必要があります。

WITH CHECK OPTION 節を指定すると、挿入または更新操作の際に、その結果行がビュー定義の WHERE 節に対して検証されます。これで、挿入または変更した行が、確実に導出されたビュー・テーブルの一部になります。利用可能なチェック・オプションは以下に示す 2 つです。

  • WITH LOCAL CHECK OPTION では、INSERT または UPDATE 文で指定されたビューの WHERE 節のみがチェックされます。

  • WITH CASCADED CHECK OPTION では、INSERT または UPDATE 文で指定されたビューおよびすべての基本ビューで指定された WHERE 節がチェックされます。これは、この基本ビューのあらゆる WITH LOCAL CHECK OPTION 節よりも優先されます。更新可能なすべてのビューについて、WITH CASCADED CHECK OPTION を指定することをお勧めします。

    WITH CHECK OPTION を指定した場合、チェック・オプションは既定で CASCADED になります。キーワード CASCADE は CASCADED の同義語です。

INSERT オペレーションで WITH CHECK OPTION 検証 (上記の説明にある) に失敗すると、Caché は SQLCODE -136 エラーを発行します。

UPDATE オペレーションで WITH CHECK OPTION 検証 (上記の説明にある) に失敗すると、Caché は SQLCODE -137 エラーを発行します。

以下の例は、PhoneBook テーブルから "CityPhoneBook" という名前のビューを作成します。

CREATE VIEW CityPhoneBook AS
     SELECT Name FROM PhoneBook WHERE City='Boston'

以下の例は、Guides テーブルから "GuideHistory" という名前のビューを作成します。すべてのタイトル (Title 列から) と、その人が退職したか否かをリストにします。

CREATE VIEW GuideHistory AS
     SELECT Guides, Title, Retired, Date_Retired 
     FROM Guides

以下の埋め込み SQL 例は、テーブル MyTest を作成し、次に MyTest から 1 つのフィールドを選択するビュー MyTestView を作成します。

  DO $SYSTEM.Security.Login("_SYSTEM","SYS")
  &sql(DROP TABLE Sample.MyTest)
  &sql(DROP VIEW Sample.MyTestView)
CreateTable
  &sql(CREATE TABLE Sample.MyTest (
     TestNum     INT NOT NULL,
     FirstWord   CHAR (30) NOT NULL,
     LastWord    CHAR (30) NOT NULL,
     CONSTRAINT MyTestPK PRIMARY KEY (TestNum))
  )
  IF SQLCODE=0 { WRITE !,"Created table" }
  ELSE { WRITE "CREATE TABLE error SQLCODE=",SQLCODE }
CreateView
  &sql(CREATE VIEW Sample.MyTestView AS
     SELECT FirstWord FROM Sample.MyTest
     WITH CASCADED CHECK OPTION)
  IF SQLCODE=0 { WRITE !,"Created view" }
  ELSE { WRITE "CREATE VIEW error SQLCODE=",SQLCODE }

以下の埋め込み SQL 例は、MyTest から 2 つのフィールドを選択するビュー MyTestView を作成します。このビューの SELECT クエリには TOP 節と ORDER BY 節が含まれます。

  DO $SYSTEM.Security.Login("_SYSTEM","SYS")
  &sql(DROP TABLE Sample.MyTest)
  &sql(DROP VIEW Sample.MyTestView)
CreateTable
  &sql(CREATE TABLE Sample.MyTest (
     TestNum     INT NOT NULL,
     FirstWord   CHAR (30) NOT NULL,
     LastWord    CHAR (30) NOT NULL,
     CONSTRAINT MyTestPK PRIMARY KEY (TestNum))
  )
  IF SQLCODE=0 { WRITE !,"Created table" }
  ELSE { WRITE "CREATE TABLE error SQLCODE=",SQLCODE }
CreateView
  &sql(CREATE VIEW Sample.MyTestView AS
     SELECT TOP ALL FirstWord,LastWord FROM Sample.MyTest
     ORDER BY LastWord)
  IF SQLCODE=0 { WRITE !,"Created view" }
  ELSE { WRITE "CREATE VIEW error SQLCODE=",SQLCODE }

以下の例は、3 つのテーブル (Proj、Staff、Works) から "StaffWorksDesign" という名前のビューを作成します。Name 列、Cost 列、Project 列はデータを提供します。

CREATE VIEW StaffWorksDesign (Name,Cost,Project)
     AS SELECT EmpName,Hours*2*Grade,PName
     FROM Proj,Staff,Works 
     WHERE Staff.EmpNum=Works.EmpNum 
          AND Works.PNum=Proj.PNum AND PType='Design'

以下の例は、UNION を使用して b.table2 と a.table1 から選択することにより “v_3” という名前のビューを作成します。

CREATE VIEW v_3(fvarchar)
     AS SELECT DISTINCT * 
     FROM
       (SELECT fVARCHAR2 FROM b.table2 
        UNION ALL
        SELECT fVARCHAR1 FROM a.table1) 

関連項目

FeedbackOpens in a new tab