剥奪できる権限には次の種類があります。
- 表から情報を削除する。
- 表に情報を挿入する。
- 表や表にある列の部分集合に対して、外部キー参照を作成する。
- 表やビュー、表の列の部分集合から、情報を選択する。
- 表にトリガを作成する
- 表や表にある列の部分集合にある情報を更新する。
- 関数や手続きなどのプログラムルーチンを実行する。
REVOKE文を発行する前に、derby.database.sqlAuthorization属性がtrueであることを確認してください。derby.database.sqlAuthorization属性により、SQL認証が有効になります。
情報の所有者かデータベースの所有者であれば、その情報への権限を剥奪する事ができます。
REVOKE文の使い方は、表への権限を剥奪するのか、プログラムルーチンへの権限を剥奪するのかにより異なります。
表の場合の使い方
REVOKE 権限タイプ ON [ TABLE ] { | } FROM 権限を与えられていた人列の一覧を指定せずに権限を剥奪した場合、表の全ての列への権限が剥奪されます。
プログラムルーチンの場合の使い方REVOKE EXECUTE ON { FUNCTION | PROCEDURE } プログラムルーチンの指示子 FROM 権限を与えられていた人 RESTRICTプログラムルーチンにREVOKE文を使う場合、RESTRICT節が必要です。RESTRICT節は、実行権限がビューや表、制約からは剥奪されない一方で、ビューや表、制約の所有者からは剥奪されることを表します。
権限タイプALL PRIVILEGES |
各種権限
表権限 DELETE |
INSERT |
REFERENCES [列一覧] |
SELECT [列一覧] |
TRIGGER |
UPDATE [列一覧]
権限タイプのALL PRIVILEGESは、表への全ての権限をユーザから剥奪する時に使います。各種権限を指定して、表への一つ以上の権限を剥奪することもできます。
DELETEの権限タイプは、表の行を削除する権限を剥奪するために使います。
INSERTの権限タイプは、表に行を挿入する権限を剥奪するために使います。
REFERENCESの権限タイプは、表への外部キー参照を作成する権限を剥奪するために使います。列一覧が指定された場合、その列群への外部キー参照を作成する権限だけが剥奪されます。
SELECTの権限タイプは、表またはビューの情報を選択する権限を剥奪するときに使います。列一覧が指定された場合、その列群への権限だけが剥奪されます。列一覧が指定されなかった場合、表の全列に対して操作が有効です。
TRIGGERの権限タイプは、表にトリガを作成する権限を剥奪するとめに使います。
UPDATEの権限タイプは、表にUPDATE文を実行する権限を剥奪するために使います。列一覧が指定された場合、その列群への権限だけが剥奪されます。
権限を与えられていた人{ 認証識別子 | PUBLIC } [,{ authorization ID | PUBLIC } ] *
指定したユーザあるいは全ユーザから、権限の剥奪を行うことができます。全ユーザを指定するときは、PUBLICというキーワードを使います。PUBLICで剥奪される権限と、ユーザを指定して剥奪される権限は独立した物です。例を挙げましょう。表tへのSELECT権限が、PUBLICとharryという認証識別子の両方に与えられているとします。
ここで、harryという認証識別子からSELECT権限が剥奪されたとしても、harryという認証識別子はPUBLIC権限を通して、表tを操作可能です。
情報の所有者の権限を剥奪することはできません。
プログラムルーチンの指示子 {
qualified-name [ signature ]
}
剥奪された権限に連なる依存関係
剥奪された権限に依存しているビューやトリガ、制約等は自動的に削除されます。このとき は、剥奪された権限を他の権限で代替しようとしません。詳しくは、Derby Developer's Guideの"SQL standard authorization"を参照してください。
制限事項REVOKE文には次の制限事項があります。
- 表毎の権限に関連した権限
- 表毎の権限に対応して、SYSTABLEPERMSシステム表に表IDと権限の付与先が記録されます。たとえば、user2に、表user1.t1のSELECTとDELETEの権限が付与された場合、SYSTABLEPERMS表には対応した行がひとつ追加されます。この行にのGRANTEE欄はuser2という値をとって、TABLEID欄はuser1.t1という値をとります。さらにSELECTPRIVとDELETEPRIVのそれぞれの欄の値はYをとります。それ以外の権限に対応した欄の値はNです。
権限を付与されたユーザが表へのいずれかの権限を必要とする情報をデータベースに作成すると、 のエンジンは、その情報がSYSTABLEPERMSにある特定の行へ依存していることを理解します。
例えば、user2がSELECT * FROM
user1.t1という文でv1というビューを作成すると、ビューのv1と、GRANTEE欄がuser2でTABLEID欄がuser1.t1であるSYSTABLEPERMSの行との間に、管理対象となる依存関係があるとプログラムは理解します。ここで、プログラムはビューが特定の行に依存していることを理解しますが、その行にある権限に対応した欄のうち、どの欄に依存しているのかは理解していません。
そのせいで、表毎の権限を剥奪するREVOKE文が発行されると、その権限と同じ表IDとユーザの組み合わせを持つ権限に依存したデータベース上の情報は全て削除されてしまいます。例で説明すると、user1がuser2から表t1のDELETE権限を剥奪すると、SYSTABLEPERMS表のGRANTEE欄にuser2をとりTABLEID欄にuser1.t1をとる行がREVOKE文により更新されます。このとき依存関係の管理機能により、その行に記録されたDELETE権限には依存していないにもかかわらず、権限の剥奪による無効化のメッセージがuser2.v1にも送信されるので、このビューは削除されてしまいます。
- 列毎の権限に関連した制限
- SYSCOLPERMSシステム表の行毎に、権限の付与先と表IDの組み合わせに許可された権限をひとつだけ記録することができます。たとえば、user2に表user1.t1にあるc12とc13という列のSELECT権限が与えられた場合、SYSCOLPERMSには行がひとつ追加されます。この行はGRANTEE欄の値にuser2をとり、TABLEID欄の値にuser1.t1をとり、TYPE欄の値にSをとり、COLUMNS欄の値にはc12, c13をとります。
表の列の集合に権限を付与されたユーザが、その権限に依存した情報をデータベースに作成した場合、は、その情報とSYSCOLPERMS表の対応した行の間の依存関係を理解して管理下に起きます。例えばuser2がSELECT c11 FROM user1.t1という文により、v1という行を作成すると、プログラムはGRANTEE欄がuser2でTABLEID欄がuser1.t1、TYPE欄がSであるSYSCOLPERMS表の行に、v1が依存することを理解して、その依存関係を管理下に置きます。このとき、プログラムはビューがSELECT権限に依存することは理解しますが、ビューがどのカラムに依存しているかは追跡しません。
REVOKE文がカラムごとの権限に対して発行されると、その権限の権限付与先、テーブルID、権限の種類に依存したデータベース上の情報が削除されます。例で説明すると、user1がuser2から、表user1.t1の列c12へのSELECT権限を剥奪すると、GRANTEE欄がuser2でTABLEIDがuser1.t1、TYPE欄がSのSYSCOLPERMSにある行が、REVOKE文により更新されます。このとき依存関係の管理機能により、c12 という列には依存していないにもかかわらず、権限の剥奪による無効化のメッセージがuser2.v1というビューにも送信されるので、このビューは削除されてしまいます。
権限剥奪の例表tへのSELECT権限を、mariaとharryという認証識別子から剥奪する場合、次のように文を書きます。REVOKE SELECT ON TABLE t FROM maria,harry
表tへのUPDATE、TRIGGER権限をanitaとzhiという認証識別子から剥奪する場合、次のように文を書きます。REVOKE UPDATE, TRIGGER ON TABLE t FROM anita,zhi
表s.vへのSELECT権限を全ユーザから剥奪する場合、次のように文を書きます。REVOKE SELECT ON TABLE s.v FROM PUBLIC
表s.vのc1とc2という列へのUPDATE権限を全てのユーザから剥奪する場合、次のように文を書きます。REVOKE UPDATE (c1,c2) ON TABLE s.v FROM PUBLIC
pという手続きへのEXECUTE権限を、georgeという認証識別子から剥奪する場合、次のように文を書きます。
REVOKE EXECUTE ON PROCEDURE p FROM george RESTRICT