ユーザまたはロールに特権を与えます。
Synopsis
GRANT admin-privilege TO grantee
[WITH ADMIN OPTION]
GRANT role TO grantee
[WITH ADMIN OPTION]
GRANT object-privilege ON object-list TO grantee
[WITH GRANT OPTION]
GRANT コマンドは、指定したテーブル、ビュー、またはその他のエンティティ上で指定タスクを実行する特権を、指定したユーザやロールに与えます。以下の基本操作を実行できます。
ユーザに特権を与える場合は、そのユーザが即座にその特権を行使できます。ロールに特権を与える場合は、そのロールを与えられたユーザが即座にその特権を行使できます。特権を削除すると、そのユーザは即座にその特権を失います。特定の特権は、特定のユーザに一度だけ与えればよいので効率的です。複数のユーザが同じ特権を 1 人のユーザに複数回与えることができますが、1 回の
REVOKE でその特権は削除されます。
GRANT はすぐに作成および実行され、通常一度しか実行されないため、Caché では、ODBC、JDBC、またはダイナミック SQL での
GRANT にはクエリ・キャッシュは作成されません。* の展開は
GRANT コマンドの実行時に行われます。
管理者特権はユーザまたはロールに適用します。特定のオブジェクトに連携していないすべての特権 (つまりそのユーザやロールの一般特権) は、管理者特権とみなされます。このような特権はネームスペースごとに付与されます。割り当てを受けるように指定されたユーザ (またはロール) が存在しない場合、Caché は SQLCODE -118 を発行します。
この形式の
GRANT は、指定されたユーザにロールを割り当てます。また、別のロールにロールを割り当てることもできます。割り当てるように指定されたロールが存在しない場合、Caché は SQLCODE 100 を発行します。割り当てを受けるように指定されたユーザ (またはロール) が存在しない場合、Caché は SQLCODE -118 を発行します。
ロールは、SQL の
GRANT コマンドおよび
REVOKE コマンド、または Caché システム・セキュリティを使用して付与または削除できます。ただし、Caché システム・セキュリティ では、他のロールに対するロールの付与や削除はできず、
$ROLES 特殊変数を使用してもロールに対して与えられたロールは表示されません。
オブジェクト特権は、ユーザまたはロールに特定のオブジェクトに対する特権を与えます。テーブルとビュー、またはそのどちらか一方に特権を与えると、オブジェクト特権になります。%ALTER および DELETE の特権は、テーブルやビューの定義へのアクセス権を与えます。SELECT、INSERT、UPDATE、および REFERENCE の各特権は、テーブル・データへのアクセス権を与えます。EXECUTE 特権は、ストアド・プロシージャへのアクセス権を与えます。ALL PRIVILEGES 特権は、テーブルとビューのすべての特権を与えますが、EXECUTE 特権は与えません。
Note:
INSERT 特権を与えるには、同じテーブルまたはビューの SELECT 特権も与える必要があります。
以下の例は、UPDATE 特権の付与方法を示しています。
DO $SYSTEM.Security.Login("_SYSTEM","SYS")
&sql(CREATE USER Deborah IDENTIFY BY birdpw)
WRITE !,"CREATE USER error code: ",SQLCODE
&sql(CREATE TABLE SQLUSER.T1
(Field1 INT, Field2 INT, PRIMARY KEY (Field1)))
WRITE !,"CREATE TABLE error code: ",SQLCODE
&sql(GRANT UPDATE ON SQLUSER.T1 TO Deborah)
WRITE !,"GRANT error code: ",SQLCODE
指定されたオブジェクトが存在しない場合、Caché は SQLCODE -30 を発行します。指定されたユーザが存在しない場合、Caché は SQLCODE -118 を発行します。指定されたオブジェクト特権がすでに与えられている場合、Caché は SQLCODE 100 を発行します。
オブジェクトの所有者は自動的に、このオブジェクトに関わるすべての特権を維持します。
GRANT 文の TO 節は、アクセスが与えられるユーザまたはロールを指定します。grantee を指定する TO オプションを使用した後は、WITH GRANT OPTION キーワードを任意で指定して、grantee が他のユーザに同じ特権を与えることもできます。
例えば、以下のコマンドを使用して、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
%SQLCatalog_SQLUserPrivs() 呼び出しを使用した
GRANT 文の結果を見出すことができます。
GRANT %ALTER ON TestTab1Usr1 TO PUBLIC WITH GRANT OPTION
GRANT SELECT ON TestTab2Usr1 TO PUBLIC
%SQLCatalog_SQLUserPrivs('_PUBLIC') への呼び出しは、以下の結果セットを返します。
"TABLE_TYPE", "TABLE_NAME", "PRIVILEGE", "GRANTED_BY", "GRANT_OPTION"
"TABLE", "TestTab1Usr1", "%ALTER", "_SYSTEM", "Yes"
"TABLE", "TestTab2Usr1", "SELECT", "_SYSTEM", "No"
GRANT_OPTION (最初の行の最後のフィールド) の "Yes" は、WITH GRANT 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 権限を削除するには、その特権を削除して、この節なしで同じ特権を再度与える必要があります。
バージョン 5.1 以降では、
GRANT は、%GRANT_ANY_PRIVILEGE、%CREATE_USER、%ALTER_USER、%DROP_USER、%CREATE_ROLE、%GRANT_ANY_ROLE、%DROP_ANY_ROLE の一般的な管理者特権はサポートされなくなりました。これらの特権の管理は、SQL を介してではなく、システム・レベルで処理されます。これらの SQL 特権は以前のバージョンの Caché で使用可能であり、既存のコード内で使用されている場合があります。このような特権のいずれかをユーザに与えようとすると、実行はできますが、特権が与えられるのではなく、その名前のロールが与えられます。
GRANT コマンドは特権を必要とする操作です。埋め込み SQL 内で
GRANT を使用する前に、適切な特権を持つユーザとしてログインする必要があります。特権がない場合は、SQLCODE 99 エラー (特権違反) が返されます。$SYSTEM.Security.Login メソッドを使用して、以下のようにユーザに適切な特権を割り当ててください。
DO $SYSTEM.Security.Login("_SYSTEM","SYS")
&sql( )
-
ObjectScript $SYSTEM.SQL.SetSQLSecurity() 関数を呼び出します。現在の設定を確認するには、$SYSTEM.SQL.CurrentSettings() を呼び出します。これにより、
[SQL セキュリティ ON:] の設定が表示されます。
-
既定値は
真 (1) です。
真 の場合、自分に特権を与えられているアクションのみユーザは実行できます。この設定を推奨します。
このオプションが
偽 (0) に設定されている場合、SQL セキュリティは無効になります。つまり、特権ベースのテーブルやビューのセキュリティは抑制されていることを意味します。ユーザを指定しなくてもテーブルの作成が可能になります。この場合、SQL マネージャはユーザとして "_SYSTEM" を、埋め込み SQL はユーザとして "" (空文字列) を割り当てます。ユーザは特権がなくてもテーブルやビューに対してアクションを実行することができます。
以下の例は、ユーザとロールを作成してからそのロールをユーザに割り当てます。ユーザがすでに存在する場合は、SQLCODE = -118 が発行されます。ロールがすでに存在する場合は、SQLCODE = -104 が発行されます。特権またはロールがすでに割り当てられている場合は、SQLCODE は発行されません (SQLCODE = 0)。
DO $SYSTEM.Security.Login("_SYSTEM","SYS")
&sql(CREATE USER User1 IDENTIFY BY fredpw)
WRITE !,"CREATE USER error code: ",SQLCODE
&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 User1)
WRITE !,"GRANT role error code: ",SQLCODE
以下の例は、ユーザを作成し区切り識別子を持つロールを作成してから、そのロールをユーザに割り当てます。
DO $SYSTEM.Security.Login("_SYSTEM","SYS")
&sql(CREATE USER User1 IDENTIFY BY fredpw)
WRITE !,"CREATE USER error code: ",SQLCODE
&sql(SET OPTION SUPPORT_DELIMITED_IDENTIFIERS=true)
WRITE !,"SET OPTION error code: ",SQLCODE
&sql(GRANT "%DB/USER" TO User1)
WRITE !,"GRANT role error code: ",SQLCODE