13.7.1.6 REVOKE 構文

REVOKE
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    FROM user [, user] ...

REVOKE ALL PRIVILEGES, GRANT OPTION
    FROM user [, user] ...

REVOKE PROXY ON user
    FROM user [, user] ...

REVOKE ステートメントを使用すると、システム管理者は MySQL アカウントから権限を取り消すことができます。各アカウント名には、セクション6.2.3「アカウント名の指定」で説明されている形式が使用されます。例:

REVOKE INSERT ON *.* FROM 'jeffrey'@'localhost';

アカウント名のユーザー名の部分のみを指定した場合は、'%' のホスト名の部分が使用されます。

各権限が存在するレベル、priv_typepriv_level の許可される値、およびユーザーとパスワードを指定するための構文の詳細は、セクション13.7.1.4「GRANT 構文」を参照してください。

最初の REVOKE 構文を使用するには、GRANT OPTION 権限が必要であり、かつ取り消そうとしている権限を持っている必要があります。

すべての権限を取り消すには、2 番目の構文を使用します。これにより、指定された 1 人または複数のユーザーのすべてのグローバル、データベース、テーブル、カラム、およびルーチン権限が削除されます。

REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...

この REVOKE 構文を使用するには、mysql データベースに対するグローバルな CREATE USER 権限または UPDATE 権限が必要です。

REVOKE は権限を削除しますが、mysql.user テーブルエントリは削除しません。ユーザーアカウントを完全に削除するには、DROP USER (セクション13.7.1.3「DROP USER 構文」を参照してください) または DELETE を使用します。

付与テーブルに、大文字と小文字が混在したデータベースまたはテーブル名を含む権限行が保持されており、かつ lower_case_table_names システム変数が 0 以外の値に設定されている場合は、REVOKE を使用してこれらの権限を取り消すことはできません。付与テーブルを直接操作することが必要になります。(lower_case_table_names が設定されているとき、GRANT はこのような行を作成しませんが、その変数が設定される前にこのような行が作成されていた可能性があります。)

mysql プログラムから正常に実行された場合、REVOKEQuery OK, 0 rows affected で応答します。この操作によってどのような権限が付与されたかを判定するには、SHOW GRANTS を使用します。セクション13.7.5.22「SHOW GRANTS 構文」を参照してください。


User Comments
  Posted by sheila yao on March 4, 2009
Revoke statement has to match the grants issued. If grant is issued to *.*, you can only revoke *.* as well.
This in my opinion, is very inconvenient.

For example, there are only a few tables that users shouldn't have select permission and the database has over 100 tables.

The most efficient way is to grant select on database.* to this user and then revoke select on the few tables from this user.

But this won't work. Mysql will throw out an error:
revoke select on database.suchtable from 'blabal'@'localhost';
ERROR 1147 (42000): There is no such grant defined for user 'blabal' on host 'localhost' on table 'suchtable'.

So you will have to literally grant select on the 97 tables one by one in order to avoid giving the select permission on the 3 tables.

  Posted by May Doušak on June 4, 2009
Sheila, you can use script to grant all on * on selected user and then revoke what you don't want him to see.
PHP e.g.:

mysql_connect ('localhost', 'root', '******');
$r = mysql_query ("SHOW DATABASES");
while ($rr = mysql_fetch_row ($r)) {
mysql_query ("GRANT all ON " .$rr[0] .".* to user@host");
}

Then just revoke from the three databases you don't want him to see:
revoke all on mysql.* from user@host;

  Posted by Paul Caskey on October 11, 2011
Sheila,

RE: REVOKE on 3 tables out of 100
I solved this problem by creating a separate database to hold the sensitive tables, and joining those back to the master tables on unique IDs for 1-1 row joins. Yes permission changes could be scripted, but now I have a cleaner security design that is far easier to maintain as I add/remove tables from the master. There are usage inconveniences now, but I'm giving this a shot. It's easy to join across databases.

Paul

Sign Up Login You must be logged in to post a comment.