Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

CREATE VIEW (SQL)

ビューを作成します。

Synopsis

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

引数

view-name 作成するビューの名前テーブル名と同様の追加の名前付け制約に従う、有効な識別子です。ビュー名は修飾 (schema.viewname)、未修飾 (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 文は、複数のテーブルや他のビューを参照できます。

特権

CREATE VIEW コマンドの実行には特権が必要です。CREATE VIEW を実行するには、ユーザは %CREATE_VIEW 管理特権を持っている必要があります。持っていない場合、SQLCODE –99 エラーが発生し、%msg が "ユーザ 'name' は %CREATE_VIEW 特権を持っていません" に設定されます。適切な付与特権を持っている場合は、GRANT コマンドを使用して %CREATE_VIEW 特権を割り当てることができます。

作成するビューの 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.Security.CheckPrivilege()Opens in a new tab メソッドを呼び出すことにより、指定のユーザがこれらのテーブルレベルの特権を持っているかどうかを確認できます。特権の割り当てについては、"GRANT" コマンドを参照してください。

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

埋め込み 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 コマンドで割り当てます。このときユーザまたはロールにこの特権を割り当てる必要があります。既定では、CREATE VIEW のセキュリティ特権が適用されます。この特権要件は、$SYSTEM.SQL.Util.SetOption()Opens in a new tab メソッドの SET status=$SYSTEM.SQL.Util.SetOption("SQLSecurity",0,.oldval) を使用してシステム全体で構成できます。現在の設定を確認するには、$SYSTEM.SQL.CurrentSettings()Opens in a new tab メソッドを呼び出します。これにより、[SQL セキュリティ有効] 設定が表示されます。

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

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

ビューの名前付け規約

ビュー名の名前付け規約はテーブル名と同じで、同じ名前セットを共有します。そのため、同じスキーマ内でテーブルとビューに同じ名前を使用することはできません。これを実行しようとすると、SQLCODE -201 エラーが返されます。テーブルが現在のネームスペースに既に存在するかどうかを確認するには、$SYSTEM.SQL.Schema.TableExists("schema.tname")Opens in a new tab メソッドを使用します。同じ名前を持つテーブル定義およびビュー定義を投影するクラスでも、SQLCODE -201 エラーが生成されます。

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

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

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

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

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

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

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

ビュー名は修飾、未修飾のどちらでもかまいません。

ビュー名を修飾する場合は (schema.viewname)、既存のスキーマを指定することも、新規スキーマを指定することもできます。新規スキーマを指定する場合、システムがそのスキーマを作成します。

ビュー名が未修飾の場合は (viewname)、既定のスキーマ名が使用されます。

既存のビュー

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

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

OR REPLACE を指定する場合

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

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

OR REPLACE を指定しない場合

既定では、CREATE VIEW を指定すると、既存のビューと同じ名前のビューを作成しようとしても拒否され、SQLCODE -201 エラーが発行されます。現在の設定を確認するには、$SYSTEM.SQL.CurrentSettings()Opens in a new tab を呼び出します。これにより、[既存テーブルに対して DDL CREATE TABLE または CREATE VIEW を許可] 設定が表示されます。既定値は 0 (いいえ) で、これが推奨設定です。このオプションを 1 (はい) に設定すると、InterSystems IRIS はこのビューに対応するクラス定義を削除し、クラスを再作成します。これは、DROP VIEW を実行してから CREATE VIEW を実行するのとほぼ同じです。この設定を変更すると、CREATE VIEWCREATE TABLE の両方に影響することに注意してください。

管理ポータル、[システム管理][構成][SQL とオブジェクトの設定][SQL] から [冗長な DDL ステートメントを無視] チェック・ボックスにチェックを付けることにより、このオプション (および他の同様の作成、変更、および削除のオプション) をシステム全体で設定できます。

列名

ビューには括弧で囲まれた列名のリスト column-commalist をオプションで含めることができます。このような列名を指定すると、そのビューを使用する際には、この名前を使用して列のデータへのアクセスや列のデータの表示が行われます。

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

  • このビューを使用するときには、SELECT のソース・テーブルの列名を使用してデータにアクセスして表示します。

  • SELECT のソース・テーブルのいずれかの列名に列エイリアスがある場合、その列エイリアスが、このビューを使用するときにデータにアクセスして表示するために使用される名前になります。

  • SELECT のソース・テーブルの列名にテーブル・エイリアスがある場合、そのテーブル・エイリアスは、このビューを使用するときにデータにアクセスして表示するために使用される名前では使われません。

列名のリストを省略する場合は、括弧も省略する必要があります。

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

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

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

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

  • 列名は一意にしてください。重複する列名を指定すると、SQLCODE -97 エラーが発生します。列名は、句読点を削除することで、対応するクラス・プロパティ名に変換されます。句読点のみが異なる列名は許可されますが、お勧めしません。

以下の例は、ビューとクエリで列が一致するときの 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 列からのデータは、1 つのビューの列に連結できます。以下に例を示します。

    CREATE VIEW MyView (fullname) AS SELECT firstname||' '||lastname FROM MyTable
  • 複数のビューの列が同じ SELECT 列を参照できます。以下に例を示します。

    CREATE VIEW MyView (lname,surname) AS SELECT lastname,lastname FROM MyTable

SELECT 節の考慮事項

ビューは、特定のテーブルの行や列の単純なサブセットである必要はありません。ビューは、任意の複雑度を持つ SELECT 節を使用し、テーブルやビューを任意に組み合わせて指定することで作成できます。ただし、ビュー定義の SELECT 節には、いくつかの制約があります。

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

  • ホスト変数を含むことはできません。SELECT 節でホスト変数を参照しようとすると、システムにより、SQLCODE -148 エラーが生成されます。

  • INTO キーワードを含むことはできません。INTO 節と共に SELECT を指定するビューを作成することはできますが、このビューを実行すると、SQLCODE -25 エラーで失敗します。

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 スキーマに属していたとしても、既定のスキーマ名 (初期のスキーマ既定値 SQLUser.MyView など) が既定で使用されることに注意してください。ビューを関連するテーブルと共に確実に格納するために、ビュー名は常に修飾付きにすることをお勧めします。

View ID : %vid

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

ビュー経由の更新

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

Note:

ビューがシャード・テーブルに基づく場合、WITH CHECK OPTION でビューを介して INSERTUPDATE、または DELETE を実行することはできません。これを試みると、SQLCODE -35 が生じ、%msg が “シャード・テーブルに基づくビュー (sample.myview) に対し、with check option の条件で INSERT/UPDATE/DELETE を実行することはできません” に設定されます。

ビュー経由の更新を禁止するには、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 検証 (上記の説明にある) に失敗すると、InterSystems IRIS は SQLCODE -136 エラーを発行します。

UPDATE オペレーションで WITH CHECK OPTION 検証 (上記の説明にある) に失敗すると、InterSystems IRIS は 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