[[FrontPage]]へ~
-[[リファレンスガイド]]へ~
--[[Firebird SQLリファレンス]]へ~
----
*Firebird SQLリファレンス:GRANT, REVOKE, CREATE ROLE, DROP ROLE [#wf446b1d]

#contents

----
&aname(grant);
*GRANT [#pc2b18d1]
 ユーザーに対して、指定したデータベースオブジェクトの特権を与えます。 SQL,DSQL,isqlで使用できます。
**構文 [#aa7cd761]
 GRANT <privileges> ON [TABLE]
    {tablename | viewname} TO
       {<object> | <userlist> | GROUP UNIX_group}
    | EXECUTE ON PROCEDURE procname TO {<object> | <userlist>}
    | <role_granted> TO {PUBLIC | <role_grantee_list>};

 <privileges> = { ALL [PRIVILEGES] | <privilege_list> }

 <privilege_list> =
    SELECT
    | DELETE
    | INSERT
    | UPDATE [(col [, col …])]
    | REFERENCES [(col [, col …])]
    [, <privilege_list> …]

 <object> =
    PROCEDURE procname
    | TRIGGER trigname
    | VIEW viewname
    | PUBLIC
    [, <object> …]

 <userlist> =
    [USER] username
    | rolename
    | Unix_user}
    [, <userlist> …]
    [WITH GRANT OPTION]

 <role_granted> = rolename [, rolename …]

 <role_grantee_list> = [USER] username [, [USER] username …]
    [WITH ADMIN OPTION]
※ DSQLで使用する場合、終端文字のセミコロンは不要です。 isql及びC/C++の埋め込みSQLでは行の終わりを示すために終端文字は必要です。
&br;
|引数|説明|h
|privilege_list|与える特権の名前です。SELECT, DELETE, INSERT, UPDATE, REFERENCESを指定できます。|
|col|与えられた特権が当てはまる列を指定します。|
|tablename|特権を与える対象となる既存のテーブル名です。|
|viewname|特権を与える対象となる既存のビュー名です。|
|GROUP unix_group|UNIX系のシステムにおいて、/etc/groupで定義されたグループ名です。|
|object|既存のプロシージャ、トリガ、ビューの名前です。PUBLICを指定すると、すべてに対して特権を与えます。|
|userlist|セキュリティデータベース(security.fdbまたはisc4.gdb)に登録されたユーザー名もしくは CREATE ROLE で作成したロール名です。|
|WITH GRANT OPTION|指定すると、userlist で指定したユーザーに対し、与えられた特権を GRANT により他ユーザーへ与えることが出来る権限を与えます。|
|rolename|CREATE ROLE で作成された、既存のロール名です。|
|role_grantee_list|rolenameのロールが与えられるユーザーです。セキュリティデータベースに登録してある必要があります。|
|WITH ADMIN OPTION|指定すると、role_grantee_listのロールに、GRANTを行う特権を与えます。|

**詳細の説明 [#n24d9d4b]
 GRANT により、データベースオブジェクトに対する特権とロールを、指定したユーザー、ロール、または他のデータベースオブジェクトに対し与えることが出来ます。オブジェクトを作成した直後には、作成者のみがすべての特権を持っており、その作成者のみが他のユーザーやオブジェクトに対して特権を与えることが出来ます。
-次表に、使用可能な特権に関してまとめました。

|特権|ユーザーが可能な操作|h
|ALL|SELECT, DELETE, INSERT, UPDATE, REFERENCES の操作が可能です。|
|SELECT|テーブルまたはビューに対して、行の検索が可能です。|
|DELETE|テーブルまたはビューに対して、行の削除が可能です。|
|INSERT|テーブルまたはビューに対して、行の追加が可能です。|
|UPDATE|テーブルまたはビューに対して、行の列値を変更可能です。列指定を行うことにより、変更できる列を制限することが出来ます。|
|EXECUTE|ストアドプロシージャを実行することが出来ます。|
|REFERENCES|指定した列を外部キーで参照することが出来ます。列の指定を行わなかった場合、すべてのプライマリーキー(主キー)に対する特権が与えられます。指定を行う場合は、同様にすべてのプライマリーキーを指定しなければなりません。|

-ユーザーもしくはオブジェクト(ストアドプロシージャなど)がテーブルやビューにアクセスするときには、その目的に合った適切な SELECT, INSERT, UPDATE, DELETE, REFERENCES 特権が必要です。ALLは、SELECT, INSERT, UPDATE, DELETE, REFERENCES の特権をすべて持っている場合と同じになります。

-アプリケーションで、ユーザーもしくはオブジェクトがストアドプロシ−ジャを実行する場合には、EXECUTE 特権を持っている必要があります。

-あるグループのユーザーに特権を与えるためには、まず、CREATE ROLE によりロールを作成してください。そして、そのロールに "GRANT privilege TO rolename" により適切な権限を与え、また "GRANT rolename TO users" によりグループのユーザーをそのロールに割当ててください。ロールに対するユーザの追加や削除は GRANT と REVOKE を使い分けて行います。この場合、ユーザーがその特権を持った状態で接続を行いたいときには、同時にロールの指定が必要となります。

-UNIX系のシステムでは、クライアントとサーバの両方で/etc/groupにリストされたグループや同様にして/etc/passwdでリストされたユーザーに特権を与えることが出来ます。

-あるユーザーが、外部キー付きのテーブルにより他ユーザーが持つテーブルのプライマリーキー列を参照する場合、そのテーブルの所有者によって、外部キーが参照する列に対する REFERENCES 特権を与えられていなければなりません。同様にして、他のユーザーが外部キー付きテーブルに書き込む場合は、それが参照するプライマリーキーがあるテーブルに対する REFERENCSE または SELECT 特権を持っていなければなりません。&br;※これを簡単に実現する方法があります。もし、 そのテーブルが読み取られてもセキュリティ上の問題が発生しない場合には、そのプライマリキーがあるテーブルに対して PUBLIC を指定した GRANT REFERENCES を実行しておくという方法もあります。

--REFERENCES特権を与えるときには、最低でもプライマリーキーとなっている列全てに対する特権を与える必要があります。また、プライマリーキー以外の列に対するREFERENCES特権を与えても、実際には何の影響もありません。

--他のユーザーが所有するテーブルに外部キー制約を定義する場合には、そのユーザーがそのテーブルに対して REFERENCES 特権を持っているかのチェックがなされます。

--特権の照合は、外部キーの値がプライマリーキーテーブルに含まれているかのチェックが行われるときにも同時に行われます。

--ロールに対しても、REFERENCES特権を与えることが出来ます。

-WITH GRANT CHECK オプションが指定されている場合、与えられた特権を他ユーザーに与える権利も同時に与えられます。

- すべてのユーザーに特権を与えたい場合には、ユーザー名のリストを与える代わりに PUBLIC を指定してください。この場合、すべてのユーザーに特権が与えられますが、データベースオブジェクトに対しては与えられません。

-ユーザーが持つ特権を削除するには、それを与えたユーザーが、REVOKE を使用して行う必要があります。ALL指定により与えた特権を削除するには ALL 指定による削除を、PUBLIC指定により与えた特権を削除するには PUBLIC 指定による削除を行います。

**用例 [#he30987e]
-isqlでの例です。WITH GRANT OPTION を指定して、SELECTとDELETEの特権をユーザー CHOICEに与えます。

 GRANT SELECT, DELETE ON COUNTRY TO CHLOE WITH GRANT OPTION;


-埋め込みSQLでの例です。SELECTとUPDATEの特権を与えます。

 EXEC SQL
   GRANT SELECT, UPDATE ON JOB TO PROCEDURE GET_EMP_PROJ;


-埋め込みSQLでの例です。プロシージャ(ADD_EMP_PROJ)とユーザー(LUIS)に対してプロシージャの EXECUTE 特権を与えます。

 EXEC SQL
   GRANT EXECUTE ON PROCEDURE GET_EMP_PROJ
   TO PROCEDURE ADD_EMP_PROJ, LUIS;


-"administrator"というロールを作成し、そのロールに対してテーブル(table1)の UPDATE特権を与えます。続いて、user1,user2,user3をそのロールに割当てています。

 CREATE ROLE administrator;
 GRANT UPDATE ON table1 TO administrator;
 GRANT administrator TO user1, user2, user3;

**参照 [#mc68551c]
[[REVOKE>#revoke]]

これ以上の情報が欲しい場合、Data Definition Guide の privileges を参照して下さい。

----
&aname(revoke);
*REVOKE [#u204c328]
指定されたデータベースオブジェクトに対してユーザーが持つ特権を取り消します。 SQL,DQL,isqlで使用できます。

**構文 [#rb1b6c03]

 REVOKE [GRANT OPTION FOR] <privileges> ON [TABLE]
    {tablename | viewname}
        FROM {<object> | <userlist> | <rolelist> | GROUP UNIX_group}
    | EXECUTE ON PROCEDURE procname FROM {<object> | <userlist>}
    | <role_granted> FROM {PUBLIC | <role_grantee_list>};

 <privileges> = { ALL [PRIVILEGES] | <privilege_list> }

 <privilege_list> = {
    SELECT
    | DELETE
    | INSERT
    | UPDATE [(col [, col …])]
    | REFERENCES [(col [, col …])]
    [, <privilege_list> …]}

 <object> = {
    PROCEDURE procname
    | TRIGGER trigname
    | VIEW viewname
    | PUBLIC
    [, <object>]}

 <userlist> = [USER] username [, [USER] username …]

 <rolelist> = rolename [, rolename]

 <role_granted> = rolename [, rolename …]

 <role_grantee_list> = [USER] username [, [USER] username …]


※ DSQLで使用する場合、終端文字のセミコロンは不要です。 isql及びC/C++の埋め込みSQLでは行の終わりを示すために終端文字は必要です。

|引数|説明|h
|privilege_list|与えた特権の名前です。SELECT, DELETE, INSERT, UPDATE, REFERENCESを指定できます。|
|GRANT OPTION FOR|他のユーザーに対してGRANTを行う権限を取り消します。データベースオブジェクトに対しては指定できません。|
|col|与えられた特権が当てはまる列を指定します。|
|tablename|特権を取り消す対象となる既存のテーブル名です。|
|viewname|特権を取り消す対象となる既存のビュー名です。|
|GROUP unix_group|UNIX系のシステムにおいて、/etc/groupで定義されたグループ名です。|
|object|特権の取り消しを行う、既存のデータベースオブジェクトの名前です。|
|userlist|特権の取り消しを行うユーザーのリストです。|
|rolename|CREATE ROLE で作成された、既存のロール名です。|
|role_grantee_list|rolenameのロールが与えられるユーザーです。セキュリティデータベースに登録してある必要があります。|

**詳細の説明 [#r5468a55]
REVOKE により、ユーザーもしくは他のデータベースオブジェクトの特権を削除できます。特権とは、ユーザーがそれに対応した操作を行うために必要なものです。
次表に、使用可能な特権に関してまとめました。
|特権|ユーザーが可能な操作|h
|ALL|SELECT, DELETE, INSERT, UPDATE, REFERENCES の操作が可能です。|
|SELECT|テーブルまたはビューに対して、行の検索が可能です。|
|DELETE|テーブルまたはビューに対して、行の削除が可能です。|
|INSERT|テーブルまたはビューに対して、行の追加が可能です。|
|UPDATE|テーブルまたはビューに対して、行の列値を変更可能です。列指定を行うことにより、変更できる列を制限することが出来ます。|
|EXECUTE|ストアドプロシージャを実行することが出来ます。|
|REFERENCES|指定した列を外部キーで参照することが出来ます。列の指定を行わなかった場合、すべてのプライマリーキー(主キー)に対する特権が与えられます。指定を行う場合は、同様にすべてのプライマリーキーを指定しなければなりません。|

※ IB4.0以前のバージョンでは、ALLにREFERENCES特権は含まれません。 (訳注:Firebirdには関係ありません。)

-GRANT OPTION FOR を指定すると、他ユーザに対し、GRANT により権限を与えることができる権利を剥奪します。

-REVOKEに関して次の制限事項があります。
--特権を与えたユーザーのみが、その特権を取り消すことが出来ます。
--特権を与えるときは、複数のユーザーが、同じ特権を同一のデータベースオブジェクトに与えることが出来ます。このような場合、REVOKEによってあるユーザーが自分が与えた特権を取り消そうとしたときには、そのユーザーが以前に与えた特権の割当てのみが取り消されるだけです。
--PUBLIC指定で特権の取り消しを行った場合には、PUBLIC指定ですべてのユーザーに対して与えられた特権のみが取り消されます。
--あるユーザーがロールから除かれた場合、ロールのメンバーであることによって得られていた特権は、すべて無効になります。

**用例 [#zd053a2b]
すべて、isqlでのサンプルです。
SELECT特権を取り消します。
 
 REVOKE SELECT ON COUNTRY FROM MIREILLE;

プロシージャとユーザーに対して与えられていた、EXECUTE 特権を取り消します。

 REVOKE EXECUTE ON PROCEDURE GET_EMP_PROJ
      FROM PROCEDURE ADD_EMP_PROJ, LUIS;

**参照 [#r3c7af4c]
[[GRANT>#grant]]

----
&aname(create_role);
*CREATE ROLE [#id015d39]
 ロールを作成します。

**構文 [#n05951a8]

 CREATE ROLE rolename;

※ DSQLで使用する場合、終端文字のセミコロンは不要です。 isql及びC/C++の埋め込みSQLでは行の終わりを示すために終端文字は必要です。


|引数|説明|h
|rolename|ロールと関連付ける名前です。データベース内のロールの中で、一意でなければなりません。|


**詳細の説明 [#ydda2f45]

 CREATE ROLE により、ロールを作成します。ロールに対しては、ユーザーと同様にして特権を与えることが出来ます。ロールには一人もしくは複数のユーザーを割当てることが出来ます。ロールに与えられた特権は、そこに割当てられたユーザーに対しても与えられます。
 ユーザーがロールを使用する場合は、接続時にロールの指定を同時に行わなければなりません。
 ロールに特権(ALL, SELECT, INSERT, UPDATE, DELETE, EXECUTE, REFERENCES)を与えるには、GRANT を使用してください。ロールにユーザーを割当てる場合も同様です。取り消しなどを行う場合には、REVOKE を使用してください。

**用例 [#f2bf577e]

 "administrator"という名前のロールを作成します。

 CREATE ROLE administrator;

**参照 [#udb2948d]

 [[GRANT>#grant]] , [[REVOKE>#revoke]] , [[DROP ROLE>#drop_role]]

&aname(drop_role)
*DROP ROLE [#s55bfc27]

 データベースからロールを削除します。 SQL,DSQL,isql で使用できます。

**構文 [#lcf33461]

 DROP ROLE rolename;


※ DSQLで使用する場合、終端文字のセミコロンは不要です。 isql及びC/C++の埋め込みSQLでは行の終わりを示すために終端文字は必要です。


|引数|説明|h
|rolename|既存のロールの名前です。|


**詳細の説明 [#kcc41f96]

 DROP ROLE により、以前に CREATE ROLE によって作成されたロールを削除します。削除を行った場合、ユーザーがそのロールに所属することによって得られていたすべての特権は取り消されます。

 ロールの削除を行えるのは、作成者、SYSDBAユーザーおよび管理者権限を持つユーザーのみです。

**用例 [#v407f6d9]

 isqlにより、データベースからロールを削除します。

 DROP ROLE administrator;

**参照 [#ba64e154]
[[CREATE ROLE>#create_role]], [[GRANT>#grant]] , [[REVOKE>#revoke]]