GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...] ON {tbl_name | * | *.* | db_name.*} TO user_name [IDENTIFIED BY [PASSWORD] 'password'] [, user_name [IDENTIFIED BY [PASSWORD] 'password'] ...] [REQUIRE NONE | [{SSL| X509}] [CIPHER cipher [AND]] [ISSUER issuer [AND]] [SUBJECT subject]] [WITH [GRANT OPTION | MAX_QUERIES_PER_HOUR # | MAX_UPDATES_PER_HOUR # | MAX_CONNECTIONS_PER_HOUR #]] REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...] ON {tbl_name | * | *.* | db_name.*} FROM user_name [, user_name ...]
GRANT
は、MySQL バージョン 3.22.11
以降で実装されています。それより前の MySQL
バージョンでは、GRANT
ステートメントは何もしません。
システム管理者は、GRANT
コマンドと REVOKE
コマンドを使用して、ユーザを作成し、MySQL
ユーザに対して次の 4
つのレベルの権限を与えたり取り消すことができます。
グローバルレベル
グローバル権限は特定のサーバ上のすべてのデータベースに適用される。これらの権限は、mysql.user
テーブルに保存される。 GRANT ALL ON
*.*
および REVOKE ALL ON *.*
は、グローバル権限の付与および取り消しのみを行う。
データベースレベル
データベース権限は、指定したデータベースのすべてのテーブルに適用される。これらの権限は、mysql.db
テーブルおよび mysql.host
テーブルに保存される。 GRANT ALL ON
db.*
および REVOKE ALL ON
db.*
は、データベース権限の付与および取り消しのみを行う。
テーブルレベル
テーブル権限は、指定したテーブルのすべてのカラムに適用される。これらの権限は、mysql.tables_priv
テーブルに保存される。 GRANT ALL ON
db.table
および REVOKE ALL ON
db.table
は、テーブル権限の付与および取り消しのみを行う。
カラムレベル
カラム権限は、指定したテーブルの一つのカラムに適用される。これらの権限は、mysql.columns_priv
テーブルに保存される。 REVOKE
を使用する際は、対象となるカラムを指定することが必要である。
GRANT
および REVOKE
ステートメントの priv_type
には以下のいずれかを指定できます。
ALL [PRIVILEGES] |
WITH GRANT OPTION
以外のすべての権限を設定 |
ALTER |
ALTER TABLE の使用を許可 |
CREATE |
CREATE TABLE の使用を許可 |
CREATE TEMPORARY TABLES |
CREATE TEMPORARY TABLE の使用を許可 |
DELETE |
DELETE の使用を許可 |
DROP |
DROP TABLE の使用を許可 |
EXECUTE |
ストアドプロシージャの使用を許可(MySQL 5.0) |
FILE |
SELECT ... INTO OUTFILE および LOAD DATA
INFILE の使用を許可 |
INDEX |
CREATE INDEX および DROP INDEX
の使用を許可 |
INSERT |
INSERT の使用を許可 |
LOCK TABLES |
SELECT 権限を持つテーブルで LOCK
TABLES の使用を許可 |
PROCESS |
SHOW FULL PROCESSLIST の使用を許可 |
REFERENCES |
将来のために予約 |
RELOAD |
FLUSH の使用を許可 |
REPLICATION CLIENT |
スレーブおよびマスタのサーバーを知る権利を付与 |
REPLICATION SLAVE |
レプリケーションのスレーブに必要(マスタからバイナリログを読み取るため) |
SELECT |
SELECT の使用を許可 |
SHOW DATABASES |
SHOW DATABASES
によりすべてのデータベースが表示される |
SHUTDOWN |
mysqladmin shutdown の使用を許可 |
SUPER |
最大接続数に達していても接続を 1
つだけ許可し、コマンド CHANGE
MASTER 、KILL
thread 、mysqladmin
debug 、PURGE MASTER
LOGS 、および SET GLOBAL
の実行を許可 |
UPDATE |
UPDATE の使用を許可 |
USAGE |
``権限なし'' のシノニム |
GRANT OPTION |
WITH GRANT OPTION のシノニム |
USAGE
を使用すると、権限なしのユーザを作成できます。
CREATE TEMPORARY
TABLES
、EXECUTE
、LOCK
TABLES
、REPLICATION
...
、SHOW DATABASES
、および
SUPER
は、バージョン 4.0.2
で新しく導入された権限です。4.0.2
にアップグレードした後でこれらの権限を使用するには、mysql_fix_privilege_tables
スクリプトを実行する必要があります。 See
項2.5.6. 「権限テーブルのアップグレード」。
古い MySQL バージョンでは、PROCESS
権限が新しい SUPER
権限と同じ働きをします。
ユーザの GRANT
権限を取り消すには、次のように
priv_type
値として GRANT
OPTION
を使用します。
mysql> REVOKE GRANT OPTION ON ... FROM ...;
テーブルに対して指定できる
priv_type
値は、SELECT
、INSERT
、UPDATE
、DELETE
、CREATE
、DROP
、GRANT
OPTION
、INDEX
、および
ALTER
だけです。
カラムに対して指定できる(つまり、column_list
節を使用する場合の)priv_type
値は、SELECT
、INSERT
、および
UPDATE
だけです。
MySQL では、データベースが存在しない場合でもデータベースレベルの権限を作成でき、データベース使用の準備を行えます。 ただし現在のところ、テーブルが存在しない場合にはテーブルレベルの権限は作成できません。テーブルやデータベースを破棄した場合でも、MySQL が自動的に権限を取り消すことはありません。
グローバル権限は ON *.*
構文を使用して設定できます。データベース権限は
ON db_name.*
構文を使用して設定できます。ON
*
を指定したときにカレントデータベースがあれば、そのデータベースの権限が設定されます。警告:
ON *
を指定したときにカレントデータベースがなければ、グローバル権限に影響します。
注意:
GRANT
コマンドでデータベース名を指定する際、‘_
’
および ‘%
’
ワイルドカードを使用できます。データベース名の一部として、たとえば
‘_
’
文字を使用したい場合、GRANT
コマンドでは GRANT ... ON `foo\_bar`.* TO
...
などのように、'\_
'
として指定するようしてください。そうしないと、ワイルドカードパターンに一致する別のデータベースにもユーザがアクセスできるようになります。
MySQL
では、任意のホストのユーザに権限を付与できるように、user_name
値を user@host
形式で指定できるようになっています。特殊文字(‘-
’
など)を含む user
文字列を指定したり、特殊文字またはワイルドカード文字(‘%
’
など)を含む host
文字列を指定したい場合、ユーザ名またはホスト名を引用符で囲むことができます(たとえば、'test-user'@'test-hostname'
)。
ホスト名にワイルドカードを使用できます。たとえば、user@'%.loc.gov'
は loc.gov
ドメインのどのホストの
user
にも当てはまり、user@'144.155.166.%'
は 144.155.166
クラス C
のどのホストの user
にも当てはまります。
シンプルな形式 user
は
user@"%"
のシノニムです。
MySQL
では、ユーザ名でのワイルドカード使用をサポートしていません。匿名ユーザの定義には、User=''
のエントリを mysql.user
テーブルに挿入するか、GRANT
コマンドで空白名のユーザを作成します。
注意: 匿名ユーザが
MySQL
サーバに接続できるようにする場合、すべてのローカルユーザに対して、user@localhost
として権限を設定する必要があります。そうしないと、ユーザがローカルマシンから
MySQL
サーバにログインしようとしたときに、mysql.user
テーブルのローカルホストの匿名ユーザエントリが使用されるからです。
これを確認するには、以下のクエリを実行します。
mysql> SELECT Host,User FROM mysql.user WHERE User='';
現在のところ、GRANT
ではホスト、テーブル、データベース、およびカラムの名前に最大
60 文字まで使用できます。ユーザ名は最大 16
文字までです。
テーブルまたはカラムに対する権限は、4
つのレベルの権限の論理和(OR)で形成されます。たとえば、mysql.user
テーブルでユーザにグローバル
SELECT
権限が設定されている場合、これがデータベース、テーブル、またはカラムレベルのエントリで拒否されることはありません。
カラムに対する権限は以下のように計算されます。
global privileges OR (database privileges AND host privileges) OR table privileges OR column privileges
多くの場合、ユーザへの権限設定には権限レベルを 1 つだけしか使用しないので、上述のように複雑にはなりません。権限チェックプロシージャの詳細については、項4.3. 「一般的なセキュリティ関連事項と MySQL アクセス制御システム」 を参照してください。
mysql.user
テーブルに存在しないユーザとホスト名の組み合わせに権限を付与すると、そのエントリはテーブルに追加され、DELETE
コマンドで削除されるまでそこに残ります。つまり、GRANT
で user
テーブルエントリを作成できますが、REVOKE
ではそのエントリを削除できません。削除するには明示的に
DELETE
を使用する必要があります。
MySQL バージョン 3.22.12
以降では、新規ユーザが作成された場合、またはグローバル権限を付与する場合、IDENTIFIED
BY
節でパスワードが指定されていれば、それがそのユーザのパスワードになります。すでにユーザにパスワードがある場合は、新しいパスワードに置き換えられます。
テキスト形式でパスワードを送信するのが望ましくなければ、PASSWORD
オプションを使用して、SQL 関数
PASSWORD()
または C API 関数
make_scrambled_password(char *to, const char
*password)
で生成した暗号化パスワードを設定できます。
警告:
新規ユーザを作成した際、IDENTIFIED
BY
節を指定しなければそのユーザはパスワードなしになります。つまり、危険です。
パスワードの設定には、SET PASSWORD
コマンドを使用することもできます。 See
項5.5.6. 「SET
構文」。
データベースに対する権限を設定する場合、必要に応じて
mysql.db
テーブルにエントリが作成されます。REVOKE
でそのデータベースのすべての権限が削除されると、このエントリも削除されます。
ユーザがテーブルに何の権限も持っていない場合、SHOW
TABLES
ステートメントなどでテーブルのリストを要求しても、テーブルは表示されません。SHOW
DATABASES
でも同様です。
WITH GRANT OPTION
節を使用すると、ユーザは自分が所有する権限を他のユーザに与えることができます。
GRANT
権限をユーザに設定する際は注意が必要です。2
人のユーザがお互いの権限を組み合わせることが可能になるからです。
MAX_QUERIES_PER_HOUR
#
、MAX_UPDATES_PER_HOUR
#
、および MAX_CONNECTIONS_PER_HOUR
#
は MySQL バージョン 4.0.2
で新しく導入されました。
これらのオプションは、1
時間でユーザが実行できるクエリ、更新、およびログインの回数を制限します。#
が
0(デフォルト)の場合、そのユーザに制限はないということです。
See 項4.4.7. 「ユーザリソースの制限」。 注意:
既存ユーザに追加権限を設定することなくこれらのオプションを指定するには、GRANT
USAGE ON *.* ... WITH MAX_...
を使用します。
自分自身が持っていない権限を他のユーザに与えることはできません。GRANT
権限では、自分が所有する権限だけを他のユーザに与えることができます。
あるレベルの GRANT
権限をユーザに設定すると、そのユーザがそのレベルで所有する(および将来所有する)すべての権限を、そのユーザは他のユーザに設定できるということに注意してください。
あるユーザにデータベースに対する
INSERT
権限を付与したと仮定します。次にデータベースの
SELECT
権限を付与する際 WITH
GRANT OPTION
を指定した場合、そのユーザは
SELECT
権限だけでなく
INSERT
権限も他のユーザに与えることができます。さらにデータベースの
UPDATE
権限をそのユーザに与えると、そのユーザは
INSERT
、SELECT
、および
UPDATE
権限を他のユーザに与えることができるようになります。
ALTER
権限は一般ユーザには付与しないでください。設定すると、そのユーザはテーブルの名前を変更して、権限システムを破ることができるようになります。
注意: 1 人のユーザだけにテーブル権限またはカラム権限を設定した場合でも、サーバはすべてのユーザのテーブル権限とカラム権限を調べるため、MySQL の処理速度は少し低下します。
mysqld
の起動時、すべての権限がメモリに読み込まれます。
データベース権限、テーブル権限、およびカラム権限はすぐに反映されますが、ユーザレベルの権限はユーザが次回接続したときに有効となります。
GRANT
または REVOKE
によって行われた権限テーブルへの変更については、サーバは即座に認識します。
INSERT
、UPDATE
などを使って手動で権限テーブルを変更した場合、FLUSH
PRIVILEGES
ステートメントまたは
mysqladmin flush-privileges
を実行してサーバに権限テーブルを再読み込みさせる必要があります。
See 項4.4.3. 「権限の変更はいつ反映されるか」。
GRANT
の標準 SQL のバージョンと
MySQL
バージョンでの最大の違いは以下のとおりです。
MySQL の権限は、ユーザ名のみではなく、ユーザ名とホスト名の組み合わせで指定される。
SQL-99
にはグローバル権限およびデータベースレベルの権限がなく、MySQL
がサポートするタイプの権限すべてをサポートしない。
MySQL は、SQL-99 の TRIGGER
権限と
UNDER
権限をサポートしない。
SQL-99 権限は、階層的に構成されている。あるユーザを削除すると、そのユーザに設定されているすべての権限が取り消される。MySQL では、設定された権限が自動的に取り消されることはなく、必要な場合は自分で取り消す必要がある。
MySQL では、テーブルの一部のカラムで
INSERT
権限が設定されている場合、そのテーブルに対して
INSERT
ステートメントを実行できる。この場合、INSERT
権限のないカラムにはデフォルト値が設定される。SQL-99
では、すべてのカラムで INSERT
権限が必要となる。
SQL99
でテーブルを破棄すると、そのテーブルのすべての権限が取り消される。
SQL-99 では、1
つの権限を取り消すと、その権限をベースとするすべての権限も取り消される。MySQL
で権限を破棄するには、明示的に
REVOKE
コマンドを使用するか
MySQL
権限テーブルを操作することが必要である。
REQUIRE
の使用法については、項4.4.10. 「安全な接続の使用」
を参照してください。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.