概要
GRANT コマンドは、指定したテーブル、ビュー、列、またはその他のエンティティ上で指定タスクを実行する特権を、指定したユーザやロールに与えます。以下の基本操作を実行できます。
-
ユーザに特権を与える
-
ロールに特権を与える
-
ユーザにロールを与える
-
ロールにロールを与え、ロールの階層を作成する
ユーザに特権を与える場合は、そのユーザが即座にその特権を行使できます。ロールに特権を与える場合は、そのロールを与えられたユーザが即座にその特権を行使できます。特権を削除すると、そのユーザは即座にその特権を失います。特定の特権は、特定のユーザに一度だけ与えればよいので効率的です。複数のユーザが同じ特権を 1 人のユーザに複数回与えることができますが、1 回の REVOKE でその特権は削除されます。
特権はネームスペースごとに付与されます。
SQL 特権は、ODBC、JDBC、およびダイナミック SQL (%SQL.Statement) を介してのみ適用されます。
GRANT はすぐに作成および実行され、通常一度しか実行されないため、InterSystems IRIS では、ODBC、JDBC、またはダイナミック SQL での GRANT にはクエリ・キャッシュは作成されません。* の展開は GRANT コマンドの実行時に行われます。
GRANT admin-privilege
SQL 管理者 (admin) 特権は、ユーザまたはロールに適用します。特定のオブジェクトに結び付けられていない特権 (つまり、そのユーザやロールの一般特権) は、管理者特権と見なされます。このような特権は、現在のネームスペースに基づいて、ネームスペースごとに付与されます。
%DB_OBJECT_DEFINITION 特権は、16 個すべてのデータ定義特権を付与します。%BUILD_INDEX、%NOCHECK、%NOINDEX、%NOLOCK、および %NOTRIGGER 特権は付与されません。それらは、明示的に付与する必要があります。
%BUILD_INDEX 特権は BUILD INDEX コマンドの使用権限を付与します。%NOCHECK、%NOINDEX、%NOLOCK、および %NOTRIGGER 特権により、INSERT、UPDATE、INSERT OR UPDATE、または DELETE 文の restriction 節でこれらのオプションを使用できるようになります。%NOINDEX キーワードを述語条件の前で使用しても効果はありません。TRUNCATE TABLE は、%NOTRIGGER 動作によってテーブルからのすべての行の削除を実行するため、TRUNCATE TABLE の実行には %NOTRIGGER 特権が必要となります。INSERT、UPDATE、INSERT OR UPDATE、または DELETE 文を作成する際にその restriction を使用するには、適切な %NOCHECK、%NOINDEX、%NOLOCK、または %NOTRIGGER 特権が必要となります。
指定された管理者特権が (例えばスペルの誤りなどの理由で) 有効な特権名でない場合でも、InterSystems IRIS は正常に完了し、SQLCODE 100 (データの末尾に到達) を発行します。InterSystems IRIS は、指定されたユーザ (またはロール) が存在するかどうかは確認しません。指定された管理者特権は有効だが、指定されたユーザ (または、ロール) が存在しない場合、InterSystems IRIS は SQLCODE -118 エラーを発行します。
GRANT role
この形式の GRANT は、指定されたロールにユーザを割り当てます。また、別のロールにロールを割り当てることもできます。割り当て先として指定されたロールが存在しない場合、InterSystems IRIS は SQLCODE 100 (データの最後に達した) を発行します。ロールへの割り当て対象として指定されたユーザ (またはロール) が存在しない場合、InterSystems IRIS は SQLCODE -118 エラーを発行します。SuperUser でない場合に、自身が所有していないロールを付与しようとし、さらにそのロールに対する ADMIN OPTION も保有していない場合、InterSystems IRIS は SQLCODE -112 エラーを発行します。
ロールの作成には、CREATE ROLE 文を使用します。ロール名が区切り文字付き識別子の場合には、ロールへの割り当て時にロール名を引用符で囲む必要があります。
ロールは、SQL の GRANT コマンドおよび REVOKE コマンド、または InterSystems IRIS システム・セキュリティを使用して付与または削除できます。
-
管理ポータルに進み、[システム管理]、[セキュリティ]、[ユーザ] の順に選択し、現在のユーザを表示します。目的のユーザの名前を選択して、そのユーザの編集オプションを表示し、次に [ロール] タブを選択して、ユーザの 1 つ以上のロールへの割り当て (または割り当て解除) を行います。
-
管理ポータルに進み、[システム管理]、[セキュリティ]、[ロール] の順に選択し、現在のロールを表示します。目的のロールの名前を選択して、そのロールの編集オプションを表示し、次に [割り当て先] タブを選択して、ロールの 1 つ以上のロールへの割り当て (または割り当て解除) を行います。ただし、ObjectScript の $ROLES 特殊変数を使用しても、ロールに対して与えられたロールは表示されません。
GRANT object-privilege
オブジェクト特権は、ユーザまたはロールに特定のオブジェクトに対する特権を与えます。object-list に関する object-privilege を grantee に付与します。object-list では、現在のネームスペース内の 1 つまたは複数のテーブル、ビュー、ストアド・プロシージャ、またはキューブを指定できます。コンマ区切りのリストを使用することで、1 つの GRANT 文で、複数のオブジェクトに関する複数のオブジェクト特権を複数のユーザおよび/またはロールに付与できます。
以下に、使用できる object-privilege 値を示します。
-
%ALTER および DELETE の特権は、テーブルやビューの定義へのアクセス権を与えます。
-
SELECT、INSERT、UPDATE、DELETE、および REFERENCES の各特権は、テーブル・データへのアクセス権を与えます。
-
EXECUTE 特権は、ストアド・プロシージャへのアクセス権を与えます。この特権は、ストアド・プロシージャを実行したり、クエリでユーザ定義 SQL 関数を呼び出す場合に必須です。例えば、SELECT Field1,MyFunc() FROM SQLUser.MyTable では、SQLUser.MyTable に対しては SELECT 特権、SQLUser.MyFunc プロシージャに対しては EXECUTE 特権が必要になります。
-
ALL PRIVILEGES 特権は、テーブルとビューのすべての特権を与えますが、EXECUTE 特権は与えません。
object-list の値にアスタリスク (*) ワイルドカードを使用すると、現在のネームスペースのすべてのオブジェクトに対する object-privilege を付与できます。例えば、GRANT SELECT ON * TO Deborah は、このユーザに、すべてのテーブルおよびビューに対する SELECT 特権を与えます。GRANT EXECUTE ON * TO Deborah は、このユーザに、非公開でないすべてのストアド・プロシージャに対する EXECUTE 特権を与えます。
SCHEMA schema-name を object-list 値として使用すると、現在のネームスペース内の指定されたスキーマのすべてのテーブル、ビュー、およびストアド・プロシージャへの object-privilege を付与できます。以下の例により、Sample スキーマ内のすべてのオブジェクトに対する SELECT 特権が、このユーザに付与されます。
GRANT SELECT ON SCHEMA Sample TO Deborah
これには、このスキーマ内で将来定義されるすべてのオブジェクトが含まれます。複数のスキーマをコンマ区切りのリストとして指定できます。例えば以下の例では、Sample スキーマと Cinema スキーマの両方にあるすべてのオブジェクトに対して SELECT 特権が付与されます。
GRANT SELECT ON SCHEMA Sample,Cinema TO Deborah
キューブはスキーマ名で修飾していない SQL 識別子です。キューブの object-list を指定するには、CUBE (または CUBES) キーワードを指定する必要があります。キューブに付与できる特権は SELECT のみです。
以下の例では、特定のテーブルについて、特定のユーザーに SELECT と UPDATE の特権を付与しています。
DO $SYSTEM.Security.Login("_SYSTEM","SYS")
CreateUser
SET x=$SYSTEM.SQL.Security.UserExists("DeborahTest")
IF x=0 {&sql(CREATE USER DeborahTest IDENTIFY BY birdpw)
IF SQLCODE '= 0 {WRITE "CREATE USER error: ",SQLCODE,!
QUIT}
}
ELSE {WRITE "User DeborahTest exists, not changing privileges",!
QUIT }
GrantPrivsToUser
&sql(GRANT SELECT,UPDATE ON SQLUSER.T1 TO DeborahTest)
WRITE !,"GRANT error code: ",SQLCODE
DropUser
&sql(DROP USER DeborahTest)
IF SQLCODE '= 0 {WRITE "DROP USER error: ",SQLCODE,!}
特権は、既存のテーブル、ビュー、またはストアド・プロシージャにのみ明示的に付与できます。指定されたオブジェクトが存在しない場合、InterSystems IRIS は SQLCODE -30 エラーを発行します。ただし、スキーマには特権を付与できます。この場合、そのスキーマ内のすべての既存オブジェクトと、そのスキーマ内に将来作成されるすべてのオブジェクト (特権を付与する時点で存在していないオブジェクト) の両方に対する特権を与えます。
テーブルの所有者が _PUBLIC の場合、ユーザには、テーブルにアクセスするためのオブジェクト特権を付与する必要はありません。
指定されたユーザが存在しない場合、InterSystems IRIS は SQLCODE -118 エラーを発行します。指定されたオブジェクト特権が既に付与されている場合、InterSystems IRIS は SQLCODE 100 (データの最後に達した) を発行します。
オブジェクト特権は、以下のいずれかによって付与または削除できます。
-
GRANT コマンドおよび REVOKE コマンド。
-
$SYSTEM.SQL.Security.GrantPrivilege()Opens in a new tab メソッドおよび $SYSTEM.SQL.Security.RevokePrivilege()Opens in a new tab メソッド。これらのメソッドは、%Status の値を返し、SQLCODE 変数を設定します。すべてのメソッドや関数と同じように、必ず最初に返り値をテストしてください。
-
%Status=1 で SQLCODE=0 の場合 : 特権は付与または削除されました。
-
%Status=1 で SQLCODE=100 の場合 : 特権は既に付与または削除されているため、付与または削除されませんでした。
-
%Status が 1 ではなく、SQLCODE が設定されておらず未定義の可能性がある場合 : メソッドのエラーのため、特権は付与または削除されませんでした。%Status にはエラーのタイプを示す SQLCODE が含まれます。ObjPriv : 特権が無効な場合、SQLCODE -60。ObjList : 指定されたオブジェクト・タイプの ObjList オブジェクトが存在しません : SQLCODE -30、-187、-428、または -473。Type : SQLCODE -400、TABLE、VIEW、CUBES、SCHEMA、または STORED PROCEDURES のオブジェクト・タイプが予期されていました。User : SQLCODE -118、未知またはユニークではないユーザまたはロール。
-
InterSystems IRIS システム・セキュリティの使用。管理ポータルに進み、[システム管理]、[セキュリティ]、[ユーザ] (または [システム管理]、[セキュリティ]、[ロール]) の順に選択し、目的のユーザまたはロールの名前を選択してから、[SQLテーブル] タブまたは [SQLビュー] タブを選択します。ドロップダウン・リストから目的の [ネームスペース] を選択します。次に、[テーブルの追加] ボタンまたは [ビューの追加] ボタンを選択します。表示されたウィンドウでスキーマを選択し、1 つまたは複数のテーブルを選択して、特権を割り当てます。
%CHECKPRIV コマンドを呼び出すことにより、現在のユーザが指定されたオブジェクト特権を持っているかどうかを確認できます。以下の例のように、$SYSTEM.SQL.Security.CheckPrivilege()Opens in a new tab メソッドを呼び出すことにより、指定のユーザが指定されたテーブルレベルのオブジェクト特権を持っているかどうかを確認できます。
WRITE "SELECT privilege? ",$SYSTEM.SQL.Security.CheckPrivilege("DeborahTest","1,SQLUSER.TestT1","s"),!
WRITE "UPDATE privilege? ",$SYSTEM.SQL.Security.CheckPrivilege("DeborahTest","1,SQLUSER.TestT1","u"),!
WRITE "DELETE privilege? ",$SYSTEM.SQL.Security.CheckPrivilege("DeborahTest","1,SQLUSER.TestT1","d"),!
オブジェクト所有者の特権
テーブル、ビュー、またはプロシージャの所有者は常に、その SQL オブジェクトに対するすべての SQL 特権を暗黙的に持っています。オブジェクトの所有者は、そのオブジェクトがマップされているすべてのネームスペース内でそのオブジェクトに対する特権を持っています。
GRANT column-privilege
列特権は、指定したテーブルまたはビューの指定した列のリストに対して指定されている特権を、ユーザまたはロールに与えます。これにより、テーブルの一部の列へのアクセスを許可し、同じテーブル内の他の列へのアクセスを許可しないようにできます。また、テーブルやビュー全体に対して特権を定義する GRANT object-privilege オプションよりも、より詳細なアクセス制御を指定できます。grantee に特権を与える際は、テーブルに対するテーブルレベルの特権または列レベルの特権のいずれかを与える必要があります。両方を与える必要はありません。SELECT、INSERT、UPDATE、および REFERENCES の各特権は、個々の列内のデータに対するアクセス権を与えるために使用できます。
テーブルに対する SELECT、INSERT、UPDATE、または REFERENCES object-privilege を WITH GRANT OPTION 付きで付与されているユーザは、その他のユーザに、そのテーブルの列に対する同じタイプの column-privilege を与えることができます。
単一の列、またはコンマ区切りの列のリストを指定できます。column-list は括弧で囲む必要があります。列名は任意の順序で指定できます。重複していてもかまいません。対象となる列特権を、既にその特権を持っている列に与えても何の影響もありません。
以下の例は、2 つの列に対して UPDATE 特権を与えています。
GRANT UPDATE(Name,FavoriteColors) ON Sample.Person TO Deborah
列特権はテーブルまたはビューに与えることができます。ユーザ・リスト、ロール・リスト、*、および _PUBLIC を含む、あらゆるタイプの grantee に対して列特権を与えることができます。ただし、特権、フィールド名、またはテーブル名にアスタリスク (*) ワイルドカードを使用することはできません。
ユーザがテーブルに新しいレコードを挿入すると、データは、その列特権を与えられているフィールドにのみ挿入されます。その他すべてのデータ列は、定義された列の既定値か、既定値が定義されていない場合は NULL のいずれかに設定されます。RowID 列や Identity 列に列レベルの INSERT または UPDATE 特権を与えることはできません。INSERT 時、InterSystems SQL は RowID および (必要に応じて) Identity 列の値を自動的に入力します。
列レベルの特権は、SQL の GRANT コマンドおよび REVOKE コマンド、または InterSystems IRIS システム・セキュリティを使用して付与または削除できます。管理ポータルに進み、[システム管理]、[セキュリティ]、[ユーザ] (または [システム管理]、[セキュリティ]、[ロール]) の順に選択し、目的のユーザまたはロールの名前を選択してから、[SQLテーブル] タブまたは [SQLビュー] タブを選択します。ドロップダウン・リストから目的の [ネームスペース] を選択します。次に、[列の追加] ボタンを選択します。表示されたウィンドウでスキーマを選択し、テーブルを選択して 1 つまたは複数の列を選択し、特権を割り当てます。
複数の特権の付与
単一の GRANT 文を使用して、以下の特権の組み合わせを指定できます。
-
1 つ以上のロール。
-
1 つ以上のテーブルレベルの特権と、1 つ以上の列レベルの特権。複数のテーブルレベルの特権と列レベルの特権を指定するには、特権を column-list の直前に置いて、列レベルの特権を与える必要があります。そうでない場合は、テーブルレベルの特権が与えられます。
-
1 つ以上の admin-privilege。admin-privilege とロール名またはオブジェクト特権を同一の GRANT 文で指定することはできません。これを実行しようとすると、SQLCODE -1 エラーが返されます。
以下の例は、Deborah にテーブルレベルの SELECT 特権と UPDATE 特権、および列レベルの INSERT 特権を与えています。
GRANT SELECT,UPDATE,INSERT(Name,FavoriteColors) ON Sample.Person TO Deborah
以下の例は、Deborah に列レベルの SELECT、INSERT、および UPDATE 特権を与えています。
GRANT SELECT(Name,FavoriteColors),INSERT(Name,FavoriteColors),UPDATE(FavoriteColors) ON Sample.Person TO Deborah
WITH GRANT OPTION 節
オブジェクトの所有者は自動的に、このオブジェクトにかかわるすべての特権を維持します。GRANT 文の TO 節は、アクセス権が与えられるユーザまたはロールを指定します。grantee を指定する TO オプションを使用した後は、WITH GRANT OPTION キーワードを任意で指定して、grantee が他のユーザに同じ特権を与えることもできます。WITH GRANT OPTION キーワード節は、オブジェクト特権または列特権と共に使用できます。CASCADE 付きの REVOKE コマンドを使用すると、付与されているこの階層式の一連の特権を元に戻すことができます。
例えば、以下のコマンドを使用して、EMPLOYEES テーブルの %ALTER、SELECT、または INSERT 特権を Chris というユーザに与えることができます。
GRANT %ALTER, SELECT, INSERT
ON EMPLOYEES
TO Chris
Chris に他のユーザに対するこれらの特権を与えることができるようにするために、GRANT コマンドは WITH GRANT OPTION 句を含みます。
GRANT %ALTER, SELECT, INSERT
ON EMPLOYEES
TO Chris WITH GRANT OPTION
%SQLCatalogPriv.SQLUsers() メソッド呼び出しを使用した GRANT 文の結果を見つけることができます。
スキーマ WITH GRANT OPTION に特権を付与すると、特権受領者 (1 人または複数人) は、同じスキーマ特権を他のユーザに付与できるようになります。ただし、特権受領者は、そのユーザがその特定のオブジェクトの WITH GRANT OPTION に関する特権を明示的に与えられていない限り、そのスキーマ内の指定されたオブジェクトに対する特権を付与することはできません。詳細は、以下の例を参照してください。
-
UserA および UserB には、最初は特権はありません。
-
UserA に、スキーマ Sample WITH GRANT OPTION 対する SELECT 特権を付与します。
-
UserA は、スキーマ Sample に対する SELECT 特権を UserB に付与できます。
-
UserA は、テーブル Sample.Person に対する SELECT 特権を UserB に付与することはできません。
WITH ADMIN OPTION 節
WITH ADMIN OPTION 節が grantee に特権を与えると、grantee は自分が与えられたのと同じ特権を他のユーザに与える権利を持つことになります。システム特権を与えるには、そのユーザが WITH ADMIN OPTION でシステム特権を与えられている必要があります。
ユーザがロールを与えることができるのは、自分に WITH ADMIN OPTION でそのロールが与えられているか、%Admin_Secure:"U" リソースを持っている場合です。
WITH ADMIN OPTION での特権の付与は、同じ特権のこのオプションなしでの前回の付与に置き換わります。したがって、ユーザに WITH ADMIN OPTION なしで特権を与え、次に同じ特権を WITH ADMIN OPTION 付きで同じユーザに与えると、そのユーザは WITH ADMIN OPTION 権限を保有します。一方、WITH ADMIN OPTION なしでの付与は、同じ特権のこのオプション付きでの前回の付与に置き換わりません。特権から WITH ADMIN OPTION 権限を削除するには、その特権を削除して、この節なしで同じ特権を再度与える必要があります。
InterSystems IRIS セキュリティ
埋め込み SQL 内で GRANT を使用する前に、適切な特権を持つユーザとしてログインする必要があります。特権がない場合は、SQLCODE -99 エラー (特権違反) が返されます。$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" を参照してください。
例
以下の例は、ユーザとロールを作成してからそのロールをユーザに割り当てます。ユーザまたはロールが既に存在する場合は、SQLCODE -118 エラーが発行されます。特権またはロールが既に割り当てられている場合、エラーは発行されません (SQLCODE = 0)。
DO $SYSTEM.Security.Login("_SYSTEM","SYS")
CreateUser
SET x=$SYSTEM.SQL.Security.UserExists("MarthaTest")
IF x=0 {&sql(CREATE USER MarthaTest IDENTIFY BY birdpw)
IF SQLCODE '= 0 {WRITE "CREATE USER error: ",SQLCODE,!
QUIT}
}
ELSE {WRITE "User MarthaTest exists, not changing its roles",!
QUIT }
CreateRoleAndGrant
&sql(CREATE ROLE workerbee)
WRITE !,"CREATE ROLE error code: ",SQLCODE
&sql(GRANT %CREATE_TABLE TO workerbee)
WRITE !,"GRANT privilege error code: ",SQLCODE
&sql(GRANT workerbee TO MarthaTest)
WRITE !,"GRANT role error code: ",SQLCODE
以下の例は、複数の特権の割り当てを示しています。ここでは、1 人のユーザと 2 つのロールを作成します。単一の GRANT 文は、これらのロールと admin-privilege のリストをユーザに割り当てます。ユーザまたはロールが既に存在する場合は、SQLCODE -118 エラーが発行されます。特権またはロールが既に割り当てられている場合、エラーは発行されません (SQLCODE = 0)。
DO $SYSTEM.Security.Login("_SYSTEM","SYS")
CreateUser
SET x=$SYSTEM.SQL.Security.UserExists("NoahTest")
IF x=0 {&sql(CREATE USER NoahTest IDENTIFY BY birdpw)
IF SQLCODE '= 0 {WRITE "CREATE USER error: ",SQLCODE,!
QUIT}
}
ELSE {WRITE "User NoahTest exists, not changing its roles",!
QUIT }
Create2RolesAndGrant
&sql(CREATE ROLE workerbee)
WRITE !,"CREATE ROLE 1 error code: ",SQLCODE
&sql(CREATE ROLE drone)
WRITE !,"CREATE ROLE 2 error code: ",SQLCODE
&sql(GRANT workerbee,drone,%CREATE_TABLE,%DROP_TABLE TO NoahTest)
WRITE !,"GRANT roles & privileges error code: ",SQLCODE
以下の例は、現在定義されていて %All ロールを持たないすべてのユーザに、現在のネームスペース内のすべてのテーブルに対する 7 つすべての基本的な特権を与えています。
DO $SYSTEM.Security.Login("_SYSTEM","SYS")
&sql(GRANT * ON * TO *)