ユーザまたはロールに特権を与えます。
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]
引数
grantee コンマで区切られた、1 つ以上のユーザまたはロールのリスト。有効な値は、ユーザのリスト、ロールのリスト、"*"、または _PUBLIC です。アスタリスク (*) は、現在定義されていて %All ロールを持たないすべてのユーザを指定します。_PUBLIC キーワードにより、現在定義されているすべてのユーザと未定義のユーザが指定されます。
admin-privilege
許可されている管理者レベル特権または管理者レベル特権のコンマで区切られたリスト。以下のうち 1 つ以上をさまざまな順序で使用してリストを構成します :
%CREATE_METHOD、%DROP_METHOD、%CREATE_FUNCTION、%DROP_FUNCTION、%CREATE_PROCEDURE、%DROP_PROCEDURE、%CREATE_QUERY、%DROP_QUERY、%CREATE_TABLE、%ALTER_TABLE、%DROP_TABLE、%CREATE_VIEW、%ALTER_VIEW、%DROP_VIEW、%CREATE_TRIGGER、%DROP_TRIGGER
%DB_OBJECT_DEFINITION : 上記の 16 種類の特権をすべて与えます。
role 特権が与えられているロール、またはコンマで区切られたロールのリスト
object-privilege 付与対象の基本レベル特権、または基本レベル特権のコンマで区切られたリスト。%ALTER、DELETE、SELECT、INSERT、UPDATE、EXECUTE、および REFERENCES のうち 1 つ以上をさまざまな順序で使用してリストを構成できます。"ALL [PRIVILEGES]" または “*” のどちらかを引数の値として使用して、テーブルとビューのすべての特権を与えることもできます。
object-list object-privilege (複数の場合もあります) が与えられる 1 つ以上のテーブルビュー、またはストアド・プロシージャのコンマで区切られたリスト。“*” を使用すると、現在のネームスペース内で非表示になっていないすべてのストアド・プロシージャへの EXECUTE 特権の付与を指定することができます。
概要
GRANT コマンドは、指定したテーブル、ビュー、またはその他のエンティティ上で指定タスクを実行する特権を、指定したユーザやロールに与えます。以下の基本操作を実行できます。
ユーザに特権を与える場合は、そのユーザが即座にその特権を行使できます。ロールに特権を与える場合は、そのロールを与えられたユーザが即座にその特権を行使できます。特権を削除すると、そのユーザは即座にその特権を失います。特定の特権は、特定のユーザに一度だけ与えればよいので効率的です。複数のユーザが同じ特権を 1 人のユーザに複数回与えることができますが、1 回の REVOKE でその特権は削除されます。
特権はネームスペースごとに付与されます。
GRANT はすぐに作成および実行され、通常一度しか実行されないため、Caché では、ODBC、JDBC、またはダイナミック SQL での GRANT にはクエリ・キャッシュは作成されません。* の展開は GRANT コマンドの実行時に行われます。
GRANT admin-privilege
管理者特権はユーザまたはロールに適用します。特定のオブジェクトに連携していないすべての特権 (つまりそのユーザやロールの一般特権) は、管理者特権とみなされます。このような特権はネームスペースごとに付与されます。割り当てを受けるように指定されたユーザ (またはロール) が存在しない場合、Caché は SQLCODE -118 を発行します。
GRANT role
この形式の GRANT は、指定されたユーザにロールを割り当てます。また、別のロールにロールを割り当てることもできます。割り当てるように指定されたロールが存在しない場合、Caché は SQLCODE 100 を発行します。割り当てを受けるように指定されたユーザ (またはロール) が存在しない場合、Caché は SQLCODE -118 を発行します。
ロールは、SQL の GRANT コマンドおよび REVOKE コマンド、または Caché システム・セキュリティを使用して付与または削除できます。ただし、Caché システム・セキュリティ では、他のロールに対するロールの付与や削除はできず、$ROLES 特殊変数を使用してもロールに対して与えられたロールは表示されません。
GRANT object-privilege
オブジェクト特権は、ユーザまたはロールに特定のオブジェクトに対する特権を与えます。テーブルとビュー、またはそのどちらか一方に特権を与えると、オブジェクト特権になります。%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 を発行します。
WITH GRANT OPTION 節
オブジェクトの所有者は自動的に、このオブジェクトに関わるすべての特権を維持します。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 文を使用した後は、
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 節
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 権限を削除するには、その特権を削除して、この節なしで同じ特権を再度与える必要があります。
Caché 5.1 セキュリティ
バージョン 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(      )
特権の強制
特権の強制は、以下に示すような [SQL Security Enabled] 構成オプションの設定によって決まります。
既定値は “真” (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
関連項目