ビューを作成します。
Synopsis
CREATE VIEW view-name (column-commalist) AS select-statement WITH READ ONLY
CREATE VIEW view-name (column-commalist) AS select-statement WITH [level] CHECK OPTION
-
それには、ビューから参照するすべてのテーブル (またはビュー) に対して、SELECT 特権を持っている必要があります。指定したテーブル (またはビュー) に対する SELECT 特権を持っていない場合は、
CREATE VIEW コマンドを実行できません。
-
ビューに対する SELECT 特権の WITH GRANT OPTION を取得するには、ビューが参照するすべてのテーブル (またはビュー) について WITH GRANT OPTION を持っていなければなりません。
-
ビューについて INSERT、UPDATE、DELETE または REFERENCES 特権を取得するには、ビューが参照するすべてのテーブル (またはビュー) に対して同じ特権を持っている必要があります。これらの特権の WITH GRANT OPTION を取得するには、基になるテーブルに対して WITH GRANT OPTION 特権を持っている必要があります。
-
ビューが WITH READ ONLY に指定されていると、基本テーブルに対する特権を持っていてもそのビューに対しての INSERT、UPDATE、または DELETE 特権は認められません。後でビューが読み取り/書き込み可能に再定義されると、ビューに投影されているクラスが再コンパイルされるときにこれらの特権が追加されます。
ビューがコンパイルされると、ビューの作成者 (所有者) に %ALTER 特権の WITH GRANT OPTION が与えられます。
CREATE VIEW コマンドの実行には特権が必要です。
CREATE VIEW を使用する前に、%CREATE_VIEW 特権を得る必要があります。この設定を行わないと、SQLCODE -99 (特権違反) になります。適切な付与特権を持っていれば、
GRANT コマンドを使用して、%CREATE_VIEW 特権を割り当てることができます。埋め込み SQL では、以下のように $SYSTEM.Security.Login メソッドを使用して適切な特権を持ったユーザとしてログインできます。
DO $SYSTEM.Security.Login("_SYSTEM","SYS")
&sql( )
%CREATE_VIEW 特権は
GRANT コマンドで割り当てます。このときユーザまたはロールにこの特権を割り当てる必要があります。この要件は設定可能です。
-
ObjectScript $SYSTEM.SQL.SetSQLSecurity() 関数を呼び出します。現在の設定を確認するには、$SYSTEM.SQL.CurrentSettings() を呼び出します。これにより、
[SQL セキュリティ ON:] の設定が表示されます。
-
既定は
真 (true) (1) です。
真 の場合、ユーザは特権が付与されているテーブルやビューのみでアクションを実行できます。この設定を推奨します。
このオプションが
偽 (false) (0) に設定されている場合、SQL セキュリティは無効になります。つまり、特権ベースのテーブルやビューのセキュリティは抑制されていることを意味します。ユーザを指定しなくてもテーブルの作成が可能になります。この場合、ダイナミック SQL はユーザとして "_SYSTEM" を、埋め込み SQL はユーザとして "" (空文字列) を割り当てます。ユーザは特権がなくてもテーブルやビューに対してアクションを実行することができます。
ビュー名の名前付け規約は、テーブル名の名前付け規約と同じです。同じスキーマ内では、テーブルとビューに同じ名前を使用できません。同じ名前にすると、SQLCODE 201 が返されます。
ビュー名は、
識別子の規則に従い、以下のような制約を受けます。既定のビュー名は、簡単な識別子です。ビュー名は 128 文字を超えることはできません。
Caché はビュー名を使用して、対応するクラス名を生成します。クラス名には英数字 (文字および数字) のみが使用され、その長さは最大 25 文字です。このクラス名を生成するために、Caché は最初にビュー名から句読点を削除し、次に 25 文字 (未満) の一意の識別子を生成します。その際、クラス名の一意性を維持するために、必要に応じて最後の文字を数字に置き換えます。Caché は有効なビュー名から一意のクラス名を生成しますが、ビューの名前を付ける際には、この名前の生成に伴う以下の制約について考慮する必要があります。
-
ビュー名には、最低でも 1 文字を含める必要があります。ビュー名の先頭の文字または最初の句読点に続く文字は、数字以外の文字にする必要があります。
-
Caché は Unicode システムで、16 ビット (ワイド) 文字のビュー名をサポートします。
$ZNAME テストに合格した文字は、有効な文字です。
-
生成されたクラス名には句読点が含まれないため、句読点のみが異なるビュー名およびテーブル名の作成は可能ですが、お勧めできません。
-
ビュー名は 25 文字よりも大幅に長くすることができますが、最初の 25 の英数字が異なるようにビュー名を作成すると処理がはるかに容易になります。
ビュー名は修飾、未修飾のどちらでもかまいません。修飾付きのビュー名には、以下の構文を使用します。
未修飾のビュー名には、既定として SQLUser スキーマ (または事前構成されたシステム既定のスキーマ名) が使用されます。Caché はスキーマ名を使用して、対応するクラス・パッケージ名を生成します。SQLUser からは、パッケージ名 User が生成されます。スキーマ名と既定値の詳細は、"
テーブル参照" を参照してください。
ビューは、特定のテーブルの行や列の単純なサブセットである必要はありません。ビューは、任意の複雑度を持つ
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
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)
WRITE !,"SQL error code is: ",SQLCODE
上記の例のように、ビュー名が未修飾の場合は、ビューによって参照されるテーブルが Sample スキーマに属していたとしても、システム全体の既定 SQL スキーマ名 (この場合は User.MyView) が既定のスキーマになることに注意してください。ビューを関連するテーブルとともに確実に格納するために、ビュー名は常に修飾付きにすることをお勧めします。
ビュー経由の更新を禁止するには、WITH READ ONLY を指定します。WITH READ ONLY で生成されているビューで
INSERT、
UPDATE、または
DELETE を実行すると、SQLCODE = -35 エラーが返されます。
ビュー経由の更新を実行するには、
GRANT コマンドによって、テーブルやビューの更新に対応する特権を指定することが必要です。
-
ビューは、ビューとして投影されたクラス・クエリではありません。
-
ビューのクラスはクラス・パラメータ READONLY=1 を含むことはできません。
-
ビューの
SELECT 文は GROUP BY、HAVING、SELECT DISTINCT、UNION、または SELECT TOP 節を含むことはできません。
-
ビューの
SELECT 文はサブクエリを含むことはできません。
-
ビューの
SELECT 文は、列参照である値式だけをリストします。
-
ビューの
SELECT 文が持つことができるテーブル参照は 1 つだけで、更新可能なテーブルまたはビューのいずれかを指定する必要があります。
WITH CHECK OPTION 節を指定すると、挿入または更新操作の際に、その結果行がビュー定義の
WHERE 節に対して検証されます。これで、挿入または変更した行が、確実に導出されたビュー・テーブルの一部になります。利用可能なチェック・オプションは以下に示す 2 つです。
WITH CASCADED CHECK OPTION では、
INSERT または
UPDATE 文で指定されたビューおよびすべての基本ビューで指定された
WHERE 節がチェックされます。これは、この基本ビューのあらゆる WITH LOCAL CHECK OPTION 節よりも優先されます。CASCADED は、既定であり、更新可能なすべてのビューについて使用することをお勧めします。
INSERT オペレーションで WITH CHECK OPTION 検証 (上記の説明にある) に失敗すると、SQLCODE=136 エラーが返されます。
UPDATE オペレーションで WITH CHECK OPTION 検証 (上記の説明にある) に失敗すると、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(CREATE TABLE Sample.MyTest (
TESTNUM INT NOT NULL,
FIRSTWORD CHAR (30) NOT NULL,
LASTWORD CHAR (30) NOT NULL,
CONSTRAINT MyTestPK PRIMARY KEY (TESTNUM))
)
WRITE !,"SQL create table code is: ",SQLCODE
&sql(CREATE VIEW Sample.MyTestView AS
SELECT FIRSTWORD FROM Sample.MyTest
WITH CASCADED CHECK OPTION)
WRITE !,"SQL create view code is: ",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)