Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

REVOKE

ユーザまたはロールから特権を削除します。

Synopsis

REVOKE admin-privilege FROM grantee

REVOKE role FROM grantee

REVOKE [GRANT OPTION FOR] object-privilege 
     ON object-list FROM grantee [CASCADE | RESTRICT] [AS grantor]

REVOKE [GRANT OPTION FOR] SELECT ON CUBE[S] object-list 
FROM grantee

REVOKE column-privilege (column-list) ON table FROM grantee  [CASCADE | RESTRICT]

引数

admin-privilege

許可されている管理者レベル特権、または管理者レベル特権のコンマで区切られたリスト。 使用可能な syspriv オプションには、16 個のオブジェクト定義特権と 4 つのデータ変更特権が含まれています。

それらのオブジェクト定義特権は、%CREATE_FUNCTION、%DROP_FUNCTION、%CREATE_METHOD、%DROP_METHOD、%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 個すべてのオブジェクト定義特権を削除できます。

データ変更特権は、INSERT、UPDATE、および DELETE 操作のための %NOCHECK、%NOINDEX、%NOLOCK、%NOTRIGGER 特権です。

grantee SQL システム特権、SQL オブジェクト特権、またはロールを持つ 1 人以上のユーザのリスト。有効な値は、コンマで区切られたユーザまたはロールのリスト、または "*" です。アスタリスク (*) は、現在定義されていて %All ロールを持たないすべてのユーザを指定します。
AS grantor この節では、元の付与者の名前を指定することによって、別のユーザによって付与された特権を削除できます。有効な grantor の値は、ユーザ名、コンマで区切られたユーザ名のリスト、または "*" です。アスタリスク (*) は、現在定義されているユーザのうち、付与者であるユーザをすべて指定します。AS grantor 節を使用するには、%All ロールまたは %Admin_Secure リソースを持っている必要があります。
role ロールまたはコンマで区切られたロールのリストで、ユーザにより特権が無効とされるもの。
object-privilege 許可されている基本レベル特権、または基本レベル特権のコンマで区切られたリスト。%ALTER、DELETE、SELECT、INSERT、UPDATE、EXECUTE、および REFERENCES のうち 1 つ以上を使用してリストを構成できます。すべての権限を削除する場合は、引数の値として "ALL [PRIVILEGES]" または "*" のいずれかを使用します。キューブに付与できる特権は SELECT のみなので、キューブから削除できる特権も SELECT のみです。
object-list 削除する object-privilege (複数の場合もあります) を持つ 1 つ以上のテーブルビュー、ストアド・プロシージャ、またはキューブのコンマ区切りリスト。SCHEMA キーワードを使用すると、指定されたスキーマ内の全オブジェクトからの object-privilege の削除を指定できます。“*” を使用すると、現在のネームスペース内の全オブジェクトからの object-privilege の削除を指定できます。
column-privilege column-list にリストされた 1 つ以上の列から削除される基本レベル特権。指定できるオプションは、SELECT、INSERT、UPDATE、および REFERENCES です。
column-list コンマで区切り、括弧で囲んだ 1 つ以上の列名のリスト。
table column-list 列を含む テーブル またはビューの名前。

概要

REVOKE 文は、指定したテーブル、ビュー、列、またはその他のエンティティ上で指定タスクを実行する特権を、ユーザまたはロールから削除します。REVOKE では、ユーザからロールの割り当てを削除することもできます。REVOKEGRANT コマンドの逆の動作を行います。特権全般の詳細は、"GRANT" コマンドを参照してください。

特権を削除できるのは、その特権を付与したユーザのみです。または後述のように、CASCADE 操作を使用しても削除できます。

指定したユーザ、ユーザのリスト、またはすべてのユーザ (* 構文の使用) からロールまたは特権を削除できます。

REVOKE はすぐに作成および実行され、通常一度しか実行されないため、Caché では、ODBC、JDBC、またはダイナミック SQL での REVOKE にはクエリ・キャッシュは作成されません。

REVOKE は、実際の削除を (例えば、指定した特権が付与されていない、または削除済みであるなどの理由で) 実行できなくても、正常に完了します。ただし、REVOKE の操作中にエラーが発生した場合、SQLCODE は負の数に設定されます。

ロールの削除

ロールは、SQL の GRANT コマンドおよび REVOKE コマンド、または ^SECURITY Caché システム・セキュリティを使用して付与または削除できます。REVOKE を使用すると、ユーザからロールを削除することや、別のロールからロールを削除することができます。Caché システム・セキュリティを使用して、別のロールにロールを付与することや、別のロールからロールを削除することはできません。$ROLES 特殊変数は、ロールに付与されたロールは表示しません。

REVOKE では、削除するロールを 1 つまたはコンマ区切りのリストで指定できます。REVOKE では、指定したユーザ (またはロール)、ユーザ (またはロール) のリスト、またはすべてのユーザ (* 構文を使用) から 1 つまたは複数のロールを削除できます。

GRANT コマンドでは、存在しないロールをユーザに付与できます。REVOKE を使用すると、存在しないロールを既存のユーザから削除できます。ただし、ロール名は、ロールの付与に使用した文字と同じ大文字/小文字の区別で指定する必要があります。

存在していないユーザまたはロールから既存のロールを削除しようとすると、Caché は SQLCODE -118 エラーを発行します。SuperUser でない場合に、自身が所有していないロールを削除しようとし、さらにそのロールに対する ADMIN OPTION も保有していない場合、Caché は SQLCODE -112 エラーを発行します。

オブジェクト特権の削除

オブジェクト特権は、ユーザまたはロールに特定のオブジェクトに対する特権を与えます。object-list に関する object-privilegegrantee から削除します。object-list では、現在のネームスペース内の 1 つまたは複数のテーブル、ビュー、ストアド・プロシージャ、またはキューブを指定できます。コンマ区切りのリストを使用することで、1 つの REVOKE 文で、複数のオブジェクトに関する複数のオブジェクト特権を複数のユーザおよび/またはロールから削除できます。

object-list の値にアスタリスク (*) ワイルドカードを使用すると、現在のネームスペース内のすべてのオブジェクトから object-privilege を削除できます。例えば、REVOKE SELECT ON * FROM Deborah は、このユーザから、すべてのテーブルおよびビューに対する SELECT 特権を削除します。REVOKE EXECUTE ON * FROM Deborah は、このユーザから、非公開でないすべてのストアド・プロシージャに対する EXECUTE 特権を削除します。

SCHEMA schema-nameobject-list 値として使用すると、現在のネームスペース内の指定されたスキーマのすべてのテーブル、ビュー、およびストアド・プロシージャに対する object-privilege を削除できます。例えば、REVOKE SELECT ON SCHEMA Sample FROM Deborah は、このユーザから、Sample スキーマ内のすべてのオブジェクトに対する SELECT 特権を削除します。複数のスキーマをコンマ区切りのリストとして指定できます。例えば、REVOKE SELECT ON SCHEMA Sample,Cinema FROM Deborah は、Sample スキーマと Cinema スキーマの両方にあるすべてのオブジェクトに対する SELECT 特権を削除します。

ユーザまたはロールからオブジェクト特権を削除できます。ロールから特権を削除すると、ロールを通してしかその特権を持たないユーザからは、その特権がなくなります。特権がなくなったユーザは、そのオブジェクト特権を必要とする既存クエリ・キャッシュを実行できなくなります。

REVOKE がオブジェクト特権を呼び出すと、正常に完了し、SQLCODE は 0 に設定されます。REVOKE は、実際の削除を (例えば、指定したオブジェクト特権が付与されていない、または削除済みであるなどの理由で) 実行しない場合でも、正常に完了し、SQLCODE は 100 (これ以上データがない) に設定されます。REVOKE の操作中にエラーが発生した場合、SQLCODE は負の数に設定されます。

キューブはスキーマ名で修飾していない SQL 識別子です。キューブの object-list を指定するには、CUBE (または CUBES) キーワードを指定する必要があります。キューブは SELECT 特権しか持てないため、キューブからは SELECT 特権しか削除できません。

オブジェクト特権は、以下のいずれかによって削除できます。

  • REVOKE コマンド。

  • %SYSTEM.SQLOpens in a new tab RevokeObjPriv()Opens in a new tab メソッド。

  • Caché システム・セキュリティの使用。管理ポータルに進み、システム, セキュリティ管理, ユーザ (または システム, セキュリティ管理, ロール) を選択し、目的のユーザまたはロールで [編集] を選択してから、[SQLテーブル] タブまたは [SQLビュー] タブを選択します。ドロップダウン・リストから目的の [ネームスペース] を選択します。目的のテーブルまで下方にスクロールしてから、[取り消す] をクリックして特権を削除します。

%CHECKPRIV コマンドを呼び出すことにより、現在のユーザが指定されたオブジェクト特権を持っているかどうかを確認できます。$SYSTEM.SQL.CheckPriv()Opens in a new tab メソッドを呼び出すことにより、指定のユーザが指定されたテーブルレベルのオブジェクト特権を持っているかどうかを確認できます。

オブジェクト所有者特権の削除

オブジェクトの所有者から SQL オブジェクトに対する特権を削除しても、所有者は引き続き暗黙的にそのオブジェクトに対する特権を持ちます。オブジェクトの所有者からオブジェクトに対するすべての特権を完全に削除するには、そのオブジェクトを別の所有者または所有者なしに変更する必要があります。

Caché 2013.1 より前のバージョンでは、オブジェクトの所有者から SQL オブジェクトに対する特権を削除すると、所有者はそのオブジェクトに対する特権を持たなくなります。ただし、クラスが後でリコンパイルされると、所有者の特権が再び付与されます。

テーブルレベルおよび列レベルの特権の削除

REVOKE を使用すると、テーブルレベルの特権または列レベルの特権の付与を無効にできます。テーブルレベルの特権では、テーブル内のすべての列へのアクセスが提供されます。列レベルの特権では、テーブル内の指定された列へのアクセスが提供されます。テーブル内のすべての列に対する列レベルの特権を付与することは、テーブルレベルの特権を付与することと機能的に同等です。ただし、まったく同じというわけではありません。列レベルの REVOKE は、列レベルで付与されている特権のみを削除できます。テーブルに対してテーブルレベルの特権を与えることはできず、この特権を、1 つ以上の列に対する列レベルで削除することもできません。この場合、REVOKE 文は付与された特権に影響を与えません。

CASCADE または RESTRICT

Caché では、REVOKE object-privilege の動作を指定する、オプションの CASCADE および RESTRICT キーワードをサポートしています。いずれのキーワードも指定されていない場合、既定は RESTRICT です。

CASCADE または RESTRICT を使用すると、ユーザから object-privilege または column-privilege を削除する場合に、WITH GRANT OPTION を介して、その特権を受け取った他のユーザからもその特権を削除するかどうかを指定できます。CASCADE は、そのように関連付けられたすべての特権を削除します。RESTRICT (既定) は、関連付けられた特権が検出された場合、REVOKE を失敗させます。代わりに、SQLCODE -126 エラー “RESTRICT の REVOKE に失敗しました” を設定します。

これらのキーワードの使用法を以下の例に示します。

--UserA
   GRANT Select ON MyTable TO UserB WITH GRANT OPTION
--UserB
   GRANT Select ON MyTable TO UserC
--UserA
   REVOKE Select ON MyTable FROM UserB
   -- This REVOKE fails with SQLCODE -126
--UserA
   REVOKE Select ON MyTable FROM UserB CASCADE
   -- This REVOKE succeeds
   -- It revokes this privilege from UserB and UserC

CASCADE および RESTRICT は、MyTable を参照する UserB によって作成されたビューには影響を与えないことに注意してください。

クエリ・キャッシュへの影響

特権またはロールを削除すると、システムのすべてのクエリ・キャッシュが更新され、その特権の変更が反映されます。しかし、データベース・サーバへの ECP 接続の停止などにより、アクセスできないネームスペースがあると、REVOKE は正常に終了しますが、そのネームスペースのクエリ・キャッシュの操作は実行されません。これは、REVOKE が、接続できないネームスペースのクエリ・キャッシュを更新できず、クエリ・キャッシュ・レベルで特権を削除することができないためです。エラーは発行されません。

接続できなかったデータベース・サーバが復旧すると、そのネームスペースにあるクエリ・キャッシュの特権が正しくなくなっている可能性があります。ネームスペースがアクセス不能なときにロールまたは特権が削除された可能性がある場合は、そのネームスペースにあるクエリ・キャッシュを削除することをお勧めします。

廃止された特権

Caché バージョン 5.1 以降、REVOKE では、%GRANT_ANY_PRIVILEGE、%CREATE_USER、%ALTER_USER、%DROP_USER、%CREATE_ROLE、%GRANT_ANY_ROLE、%DROP_ANY_ROLE という一般的な管理者特権がサポートされなくなりました。これらの特権の管理は、SQL を介してではなく、システム・レベルで処理されます。これらの SQL 特権は以前のバージョンの Caché で使用可能であり、既存のコード内で使用されている場合があります。このような特権のいずれかを削除しようとすると、実行はできますが、特権が削除されるのではなく、指定されたユーザからその名前のロールの削除が試みられます。同様に、%THRESHOLD を削除しようとすると、指定されたユーザからその名前のロールの削除が試みられます。

Caché セキュリティ

REVOKE コマンドは特権を必要とする操作です。埋め込み SQL 内で REVOKE を使用する前に、適切な特権を持つユーザとしてログインする必要があります。特権がない場合は、SQLCODE -99 エラー (特権違反) が返されます。

$SYSTEM.Security.Login()Opens in a new tab メソッドを使用して、以下のようにユーザに適切な特権を割り当ててください。

   DO $SYSTEM.Security.Login("_SYSTEM","SYS")
   &sql(      )

$SYSTEM.Security.Login メソッドを呼び出すには、%Service_Login:Use 特権が必要です。詳細は、"インターシステムズ・クラス・リファレンス" の "%SYSTEM.SecurityOpens in a new tab" を参照してください。

以下の埋め込み SQL の例は、2 人のユーザと 1 つのロールを作成し、そのロールをユーザに割り当てます。その後、アスタリスク (*) 構文を使用してすべてのユーザからそのロールを削除します。ユーザまたはロールが既に存在する場合は、CREATE 文は SQLCODE -118 エラーを発行します。ユーザが存在しない場合、GRANT または REVOKE 文は SQLCODE -118 エラーを発行します。ユーザは存在するがロールが存在しない場合、GRANT または REVOKE 文は SQLCODE 100 を発行します。ユーザおよびロールが存在する場合、GRANT または REVOKE 文は SQLCODE 0 を発行します。これは、ロールの付与または削除が既に実行されている場合、または付与されていないロールを削除しようとする場合にも当てはまります。

   DO $SYSTEM.Security.Login("_SYSTEM","SYS")
   &sql(CREATE USER User1 IDENTIFY BY fredpw)
   &sql(CREATE USER User2 IDENTIFY BY barneypw)
   WRITE !,"CREATE USER error code: ",SQLCODE
   &sql(CREATE ROLE workerbee)
   WRITE !,"CREATE ROLE error code: ",SQLCODE
   &sql(GRANT workerbee TO User1,User2)
   WRITE !,"GRANT role error code: ",SQLCODE
   &sql(REVOKE workerbee FROM *)
   WRITE !,"REVOKE role error code: ",SQLCODE

以下の例では、あるユーザ (Joe) が特権を与え、別のユーザ (John) が AS grantor 節を使用してその特権を削除しています。

   /* User Joe */
   GRANT SELECT ON Sample.Person TO Michael
   /* User John */
   REVOKE SELECT ON Sample.Person FROM Michael AS Joe

John は、%All ロールまたは %Admin_Secure リソースを持っている必要があります。

関連項目

FeedbackOpens in a new tab