ALTER VIEW (SQL)
構文
ALTER VIEW viewName AS query
ALTER VIEW viewName (column, column2, ...) AS query
ALTER VIEW viewName ... AS query WITH READ ONLY
ALTER VIEW viewName ... AS query WITH
[LOCAL | CASCADED] CHECK OPTION
概要
ALTER VIEW コマンドは、CREATE VIEW コマンドを使用して作成されたビューまたは永続クラスから投影されたビューを変更します。変更したビューで既存のビューが置き換えられるので、ビューにある特定の列を変更することはできません。
view は、SELECT クエリや、そのようなクエリの UNION の結果セットに基づく仮想テーブルです。ビューの詳細は、"ビューの定義と使用" を参照してください。
-
ALTER VIEW viewName AS query は、ビューの既存の列を、SELECT クエリで返される列に置き換えます。ビュー列の名前は、クエリの結果セットに返された列名から派生するので次のようになります。
-
クエリの対象とするテーブルまたはビューの列名またはそのエイリアス
-
テーブル値関数として定義したクラス・クエリの列名
以下の文は、過去 12 か月以内に雇用された従業員のみが含まれるように NewEmployees ビューを変更します。ビューの列名 Name、Office、StartDate はソース・テーブルの列名と一致します。
ALTER VIEW NewEmployees AS SELECT Name,Office,StartDate FROM Sample.Employees WHERE DATEDIFF('month',StartDate,CURRENT_DATE) <= 12
-
-
ALTER VIEW viewName (column, column2, ...) AS query は、ビューに含める列の名前を指定します。指定する列名は SELECT クエリで返されるテーブル列の数および順序と一致させる必要があります。これらのビュー列名は SELECT 文クエリで列名のエイリアスとして指定することもできます。以下の ALTER VIEW 文は同等です。
ALTER VIEW MyView (MyViewCol1,MyViewCol2,MyViewCol3) AS SELECT TableCol1, TableCol2, TableCol3 FROM MyTable
ALTER VIEW MyView AS SELECT TableCol1 AS ViewCol1, TableCol2 AS ViewCol2, TableCol3 AS ViewCol3 FROM MyTable
列を指定すると、ビューで指定されている既存の列はすべて置き換えられます。
例 : ビューの作成と変更
-
ALTER VIEW viewName ... AS query WITH READ ONLY は、このビューの基になっているテーブルに対して、このビューからは挿入、更新、削除の各操作を実行できないように指定します。既定では、指定された任意の WITH CHECK OPTION 制約を条件として、ビュー経由でこれらの操作が許可されます。
例 : 読み取り専用ビューの設定
-
ALTER VIEW viewName ... AS query WITH [LOCAL | CASCADED] CHECK OPTION は、更新される行またはこのビューに挿入される行がビューの WHERE 制約を満たしていることを確認します。行がこれらの制約を満たしていない場合、行は更新または挿入されません。以下のチェック・オプションを指定できます。
-
WITH LOCAL CHECK OPTION — INSERT または UPDATE 文で指定されたビューの WHERE 節のみをチェックします。
-
WITH CASCADED CHECK OPTION または WITH CHECK OPTION — INSERT または UPDATE 文で指定されたビューの WHERE 節とそのビューの基になっているすべての基本ビューをチェックします。このオプションは、これらの基本ビューのすべての WITH LOCAL CHECK OPTION 節を上書きします。更新可能なすべてのビューにこのオプションを推奨します。
これらのオプションの詳細は、"WITH CHECK オプション" を参照してください。
-
引数
viewName
変更するビュー名。テーブル名と同じ命名規則で変更します。ビュー名は修飾 (schema.viewname)、未修飾 (viewname) のどちらでもかまいません。ビュー名が未修飾の場合は、既定のスキーマ名が使用されます。
指定のビューが現在のネームスペースに存在するかどうかを確認するには、$SYSTEM.SQL.Schema.ViewExists()Opens in a new tab メソッドを使用します。
永続クラスからビューを投影する場合は、そのビューに Classtype="view" キーワードと DDLAllowed キーワードを指定している場合にのみ、ALTER VIEW を実行できます。クラス・クエリから投影するビューは変更できません。
query
ビューの基準となるクエリの結果セット。クエリは、SELECT 文、または 2 つ以上の SELECT 文の UNION として指定できます。UNION コマンドの使用例については、"結合された SELECT クエリを使用したビューの変更" を参照してください。
ビュー・クエリには、ホスト変数や INTO キーワードを格納できません。query でホスト変数を参照しようとすると、システムにより、SQLCODE -148 エラーが生成されます。
column
変更されたビューに含まれる列の名前。列名が複数の場合はコンマ区切りリストで指定します。列名は、viewName 引数の後または query 引数で指定できます。
例
ビューの作成と変更
この例では、ビューを作成し、変更する方法を示します。ビューに対してクエリを実行する方法、およびビューを削除する方法も示します。
米国マサチューセッツ州に住む人の名前を含むビューを作成します。この例では、Sample.Person テーブルが既に存在し、Home_State 列が含まれていることを前提としています。
CREATE VIEW MassFolks (vFullName) AS
SELECT Name FROM Sample.Person WHERE Home_State='MA'
次に、通常のテーブルと同じように、ビューに対してクエリを実行できます。
SELECT * FROM MassFolks
ビューを変更して新しい列を含めます。ビューを変更すると、列リストが新しい列リストに置き換わりますが、既存の列リストは保存されません。このため、この変更されたビューには vMassAbbrev 列と vCity 列のみが含まれ、vFullName 列は含まれません。
ALTER VIEW MassFolks (vMassAbbrev,vCity) AS
SELECT Home_State,Home_City FROM Sample.Person WHERE Home_State='MA'
ビューを削除します。通常のテーブルと同じような方法でビューを削除できます。
DROP VIEW MassFolks
結合された SELECT クエリを使用したビューの変更
ビューを変更して、2 つの SELECT クエリの結果を結合したものを含めます。結果を結合するには、UNION コマンドを使用します。
ALTER 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
読み取り専用ビューの設定
ビューを変更し、このビューを介して基本テーブルが変更されないようにします。
ALTER VIEW YoungPeople AS
SELECT Name,DOB
FROM Sample.Person
WHERE DATEDIFF(year,DOB,CURRENT_DATE) <= 18
WITH READ ONLY
このビューを介して行を更新すると、WITH READ ONLY によって更新が阻止されます。
UPDATE YoungPeople (DOB)
VALUES (02/17/2022)
WHERE Name='Page,Laura O.'
ビューを介して行われたテーブルの変更の検証
GPA 基準を満たさない学生が挿入されないように、この特待生のビューを変更します。この例では、Sample.Student テーブルが既に存在することを前提としています。
ALTER VIEW HonorsStudent AS
SELECT Name, GPA
FROM Sample.Student
WHERE GPA > 3.0
WITH CHECK OPTION
GPA が非常に低い学生をこのビューに挿入しようとすると、VIEW CHECK OPTION によって挿入が阻止されます。
INSERT INTO HonorsStudent (Name, GPA)
VALUES ('Waal,Edgar P.',2.9)
セキュリティおよび特権
ALTER VIEW コマンドは特権を必要とする操作です。ALTER VIEW を実行するには、ユーザは %ALTER_VIEW 管理特権を持っている必要があります。持っていない場合、SQLCODE –99 エラーが発生し、%msg が "ユーザ 'name' は %ALTER_VIEW 特権を持っていません" に設定されます。
ユーザは、指定されたビューに対する %ALTER 特権を持っている必要があります。ユーザがビューの所有者 (作成者) である場合、ユーザにはそのビューに対する %ALTER 特権が自動的に付与されます。そうでない場合は、ユーザにビューに対する %ALTER 特権を付与する必要があります。持っていない場合、SQLCODE –99 エラーが発生し、%msg が "ユーザ 'name' はビュー 'Schema.ViewName' を変更する特権を持っていません" に設定されます。
適切な付与特権を保持している場合は、GRANT コマンドを使用して %ALTER_VIEW 特権と %ALTER 特権を割り当てることができます。
現在のユーザが %ALTER 特権を持っているかどうかを確認するには、%CHECKPRIV コマンドを呼び出します。指定のユーザが %ALTER 特権を持っているかどうかを確認するには、$SYSTEM.SQL.Security.CheckPrivilege()Opens in a new tab メソッドを呼び出します。
埋め込み SQL では、以下のように $SYSTEM.Security.Login()Opens in a new tab メソッドを使用して適切な特権を持ったユーザとしてログインできます。
DO $SYSTEM.Security.Login("myUserName","myPassword")
&sql(...)
$SYSTEM.Security.Login メソッドを呼び出すには、%Service_Login:Use 特権が必要です。詳細は、"%SYSTEM.SecurityOpens in a new tab" を参照してください。
ALTER VIEW は、導入済みの永続クラスから投影されたテーブルに基づくビューでは使用できません。この操作は SQLCODE -400 エラーで失敗し、%msg が “導入済みのクラス classname を変更する DDL を実行できません” に設定されます。