# REVOKE 文

REVOKE文を使って、指定したユーザあるいは全ユーザから、データベースの情報に対して操作を行う権限を剥奪することができます。

剥奪できる権限には次の種類があります。

- 表から情報を削除する。
- 表に情報を挿入する。
- 表や表にある列の部分集合に対して、外部キー参照を作成する。
- 表やビュー、表の列の部分集合から、情報を選択する。
- 表にトリガを作成する
- 表や表にある列の部分集合にある情報を更新する。
- 関数や手続きなどのプログラムルーチンを実行する。

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 は、剥奪された権限を他の権限で代替しようとしません。詳しくは、Derby ディベロッパーズ ガイドの"SQL standard authorization"を参照してください。

#### 制限事項

REVOKE文には次の制限事項があります。

表毎の権限に関連した権限
  表毎の権限に対応して、SYSTABLEPERMSシステム表に表IDと権限の付与先が記録されます。たとえば、`user2`に、表`user1.t1`のSELECTとDELETEの権限が付与された場合、SYSTABLEPERMS表には対応した行がひとつ追加されます。この行にのGRANTEE欄は`user2`という値をとって、TABLEID欄は`user1.t1`という値をとります。さらにSELECTPRIVとDELETEPRIVのそれぞれの欄の値はYをとります。それ以外の権限に対応した欄の値はNです。

  権限を付与されたユーザが表へのいずれかの権限を必要とする情報をデータベースに作成すると、Derby のエンジンは、その情報が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`をとります。

  表の列の集合に権限を付与されたユーザが、その権限に依存した情報をデータベースに作成した場合、Derbyは、その情報と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

親トピック: 文
関連概念
Using SQL standard authorization
関連資料
GRANT 文
SYSCOLPERMS システム表
SYSTABLEPERMS システム表