GRANTpriv_type
[(column_list
)] [,priv_type
[(column_list
)]] ... ON [object_type
] {tbl_name
| * | *.* |db_name
.*} TOuser
[IDENTIFIED BY [PASSWORD] 'password
'] [,user
[IDENTIFIED BY [PASSWORD] 'password
']] ... [REQUIRE NONE | [{SSL| X509}] [CIPHER 'cipher
' [AND]] [ISSUER 'issuer
' [AND]] [SUBJECT 'subject
']] [WITHwith_option
[with_option
] ...]object_type
= TABLE | FUNCTION | PROCEDUREwith_option
= GRANT OPTION | MAX_QUERIES_PER_HOURcount
| MAX_UPDATES_PER_HOURcount
| MAX_CONNECTIONS_PER_HOURcount
| MAX_USER_CONNECTIONScount
GRANT
ステートメントは、システム管理者が MySQL
ユーザ
アカウントを作成し、アカウントに権利を与える事を可能にします。GRANT
を利用する為には、GRANT OPTION
権限を持ち、また自分が供与している権限を持つ必要があります。REVOKE
ステートメントは、アカウント管理者が権限を削除する事に関連し、それを可能にします。詳しくは
項12.5.1.5. 「REVOKE
構文」 を参照してください。
MySQL アカウント情報は mysql
データベースのテーブルに格納されています。このデータベースとアクセス
コントロール システムについては
章 4. データベース管理
で詳しく説明されていますので、更なる詳細についてはこれを参照して下さい。
重要:MySQL のいくつかのリリース版は、新しい権限や特徴を追加する為に供与テーブルの構造の変更を紹介しています。MySQL の新しいバージョンを更新する時はいつでも、新しい機能を有効に利用できるようにする為に、供与テーブルを最新の構造に更新しなければいけません。詳しくは 項4.5.4. 「mysql_upgrade — MySQL アップグレードのテーブル チェック」 を参照してください。
もし供与テーブルが、大文字と小文字が混在するデータベースかテーブル名を含む権限行を保持し、lower_case_table_names
システム変数がゼロではない値に設定されたら、REVOKE
をこれらの権限を廃止する為に利用する事はできません。供与テーブルを直接コントロールする必要があるかも知れません。(GRANT
は lower_case_table_names
が設定された時にそのような行を作成しませんが、そのような行は変数を設定する前に作成されていた可能性があります。)
権限はいくつかのレベルで供与する事ができます:
グローバル レベル
既存サーバ上では、グローバル権限は全てのデータベースに適応します。これらの権限は
mysql.user
テーブル内に格納されています。GRANT
ALL ON *.*
と REVOKE ALL ON
*.*
はグローバル権限だけを供与、廃止します。
データベース レベル
データベース権限は既存データベース内の全てのオブジェクトに適応します。これらの権限は
mysql.db
と
mysql.host
テーブル内に格納されています。GRANT
ALL ON
と
db_name
.*REVOKE ALL ON
はグローバル権限だけを供与、廃止します。
db_name
.*
テーブル レベル
テーブル権限は既存テーブル内の全てのカラムに適応します。これらの権限は
mysql.tables_priv
テーブル内に格納されています。GRANT
ALL ON
と
db_name.tbl_name
REVOKE ALL ON
はグローバル権限だけを供与、廃止します。
db_name.tbl_name
カラム レベル
カラム権限は既存テーブル内の単一カラムに適応します。これらの権限は
mysql.columns_priv
テーブル内に格納されています。REVOKE
を利用している時は、供与されたカラムと同じカラムを指定する必要があります。
ルーチン レベル
CREATE ROUTINE
、ALTER
ROUTINE
、EXECUTE
、そして
GRANT
権限はストアド
ルーチンに適応します。(ファンクションとプロシージャ)それらは、グローバルとデータベース
レベルで供与されます。また、CREATE
ROUTINE
以外は、これらの権限は各ルーチンに対してルーチン
レベルで供与する事ができ、mysql.procs_priv
テーブル内で格納されます。
object_type
条項は、次のオブジェクトがテーブル、ストアド
ファンクション、またはストアド
ルーチンの時には
TABLE
、FUNCTION
、または
PROCEDURE
条項として指定されなければいけません。
GRANT
と REVOKE
ステートメントに対しては、priv_type
は次の表にある物として指定する事ができます。
権限 | 意味 |
ALL [PRIVILEGES] |
GRANT OPTION
以外の全てのシンプルな権限を設定します。 |
ALTER |
ALTER TABLE の使用を可能にします。 |
ALTER ROUTINE |
ストアド ルーチンの変更、ドロップを可能にします。 |
CREATE |
CREATE TABLE の使用を可能にします。 |
CREATE ROUTINE |
ストアド ルーチンの作成を可能にします。 |
CREATE TEMPORARY TABLES |
CREATE TEMPORARY TABLE
の使用を可能にします。 |
CREATE USER |
CREATE USER 、DROP
USER 、RENAME
USER 、そして REVOKE ALL
PRIVILEGES の使用を可能にします。 |
CREATE VIEW |
CREATE VIEW の使用を可能にします。 |
DELETE |
DELETE の使用を可能にします。 |
DROP |
DROP TABLE の使用を可能にします。 |
EVENT |
イベントスケジューラがイベントを作成するのを可能にします。 |
EXECUTE |
ユーザがストアドルーチンを起動させるのを可能にします。 |
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
は全てのデータベースを表示します。 |
SHOW VIEW |
SHOW CREATE VIEW の使用を可能にします。 |
SHUTDOWN |
mysqladmin shutdown の使用を可能にします。 |
SUPER |
CHANGE
MASTER 、KILL 、PURGE
MASTER LOGS 、そして SET
GLOBAL
ステートメントの使用を可能にし、 the
mysqladmin debug
コマンドはmax_connections
が達成していても接続を (一回)
許可します。 |
TRIGGER |
ユーザがトリガを作成、ドロップするのを可能にします。 |
UPDATE |
UPDATE の使用を可能にします。 |
USAGE |
「権限が無い」 の同義語です。 |
GRANT OPTION |
権限を与えるのを可能にします。 |
EVENT
と TRIGGER
権限は MySQL 5.1.6 で追加されました。
トリガはテーブルと関連しているので、トリガを作成したり、ドロップしたりするには、トリガではなくテーブルに
TRIGGER
権限を持つ必要あります。(MySQL 5.1.6 以前では
SUPER
権限はトリガを作成したりドロップしたりする為に必要でした。)
REFERENCES
権限は現在は利用されていません。
USAGE
は、権限を持たないユーザを作成した時に指定する事ができます。
アカウントがどんな権限を持つのかを決定する為には
SHOW GRANTS
を利用してください。詳しくは
項12.5.4.16. 「SHOW GRANTS
構文」 を参照してください。
ON *.*
構文を利用してグローバル権限を、または、ON
構文を利用してデータベース権限を割り当てる事ができます。もし
db_name
.*ON *
を指定し、デフォルト
データベースを選択したら、権限はそのデータベース内に供与されます。(警告:
もし ON *
を指定し、デフォルト
データベースを選択
しなければ
、供与される権限はグローバルになります。
FILE
、PROCESS
、RELOAD
、REPLICATION
CLIENT
、REPLICATION
SLAVE
、SHOW
DATABASES
、SHUTDOWN
、そして
SUPER
権限は、グローバルとしてのみ供与される(ON
*.*
構文を利用して)管理権限です。
その他の権限は、グローバルに、またはより特定なレベルで供与する事ができます。
テーブルに指定できる
priv_type
値は、SELECT
、INSERT
、UPDATE
、DELETE
、CREATE
、DROP
、GRANT
OPTION
、INDEX
、ALTER
、CREATE
VIEW
、SHOW VIEW
そして
TRIGGER
です。
カラムに指定できる
priv_type
値は
(column_list
条項を利用する時)、SELECT
、INSERT
、そして
UPDATE
です。
ルーチン レベルで指定できる
priv_type
値は ALTER
ROUTINE
、 EXECUTE
、そして
GRANT OPTION
です。CREATE
ROUTINE
は、最初にルーチンを作成する時にこの権限を持たなければいけないので、ルーチン
レベル権限ではありません。
GRANT ALL
は、与えようとしているレベルに存在する権限のみをグローバル、データベース、テーブル、そしてルーチン
レベルに対して割り当てます。例えば、GRANT
ALL ON
はデータベース レベル
ステートメントなので、 db_name
.*FILE
のようなグローバルのみの権限は供与しません。
MySQL は、存在しないデータベース
オブジェクト上にも権限を与える事を許容します。そのような場合、供与される権限は
CREATE
権限を含む必要があります。この動作は意図的であり、また後で作成されるデータベース
オブジェクトに対するユーザ
アカウントと権限を、データベース管理者が準備する事を可能にします。
重要:MySQL は、テーブルやデータベースをドロップする時に、自動的に権限を廃止しません。しかし、もしルーチンをドロップすると、そのルーチンに供与された全てのルーチン レベル権限は廃止されます。
注意:‘_
’
と ‘%
’
ワイルドカードは、権限をグローバル、またはデータベース
レベルで供与する GRANT
ステートメント内でデータベース名を指定する時に許容されます。
これは例えば、データベース名の一部として
‘_
’
文字を利用したければ、ワイルドカードのパターンに一致する追加データベースにアクセスする事を不可能にする為に、GRANT
ステートメント内でこれを
‘\_
’
として指定必要がるという事を意味します。例えば、GRANT
... ON `foo\_bar`.* TO ...
のようになります。
任意ホストからユーザに供与権を適応させる為に、MySQL
は
の形で user_name
@host_name
user
値を指定する事をサポートします。もし
user_name
か
host_name
値が引用されていない識別子として正当であれば、それを引用する必要はありません。しかし、引用句は特別な文字(‘-
’
等のような)を含む user_name
文字列、または特別な文字やワイルドカード文字(‘%
’
等のような)を含む host_name
文字列を指定するのに必要です。例えば、'test-user'@'test-hostname'
のようになります。ユーザ名とホスト名を別々に引用してください。
ホスト名の中でワイルドカードを指定する事ができます。例えば、
は、user_name
@'%.loc.gov'loc.gov
ドメイン内のどのホストに対しても
user_name
に適応し、
は user_name
@'144.155.166.%'144.155.166
クラス C
サブネット内のどのホストに対しても、user_name
に適応します。
シンプルな形 user_name
は、
の同義語です。
user_name
@'%'
MySQL
はユーザ名内でワイルドカードをサポートしません。.匿名のユーザは、User=''
を持つエントリを mysql.user
テーブル内に挿入する事、または
GRANT
を利用してユーザを空の名前で作成する事で定義されます。
GRANT ALL ON test.* TO ''@'localhost' ...
引用された値、引用データベース、テーブル、カラム、そしてルーチン名を識別子として指定する時は、バッククォートを利用しています。(‘`
’)ホスト名、ユーザ名、そしてパスワードを文字列として、単一引用句(‘'
’)を利用して引用してください。
警告:匿名ユーザが
MySQL
サーバに接続する事を許可するなら、全てのローカル
ユーザにも
として権限を供与する必要があります。そうでなければ、名づけられたユーザがローカル
マシンから MySQL
サーバにログインしようとした時に、user_name
@localhostmysql.user
テーブル内(MySQL
インストールの最中に作成された物)の
localhost
の匿名ユーザ
アカウントが利用されます。 詳細に関しては
項4.7.5. 「アクセス制御の段階 1: 接続確認」
を参照して下さい。
匿名ユーザをリスト アップしてある次のクエリを実行する事によって、これが当てはまるかどうかを決定する事ができます。
SELECT Host, User FROM mysql.user WHERE User='';
もし先ほど説明した問題を防ぐ為に、ローカル匿名ユーザ アカウントを削除したければ、次のステートメントを利用してください。
DELETE FROM mysql.user WHERE Host='localhost' AND User=''; FLUSH PRIVILEGES;
GRANT
は最大60文字のホスト名をサポートします。データベース、テーブル、カラム、そしてルーチン名は最大64文字です。ユーザ名は最大16文字です。注意:ユーザ名の許容長さは、mysql.user
テーブルを変更しても変える事はできません。もしそれをすると、ユーザが
MySQL
サーバにログインできなくなってしまうような、予想不可能な動作に陥る可能性があります。項4.5.4. 「mysql_upgrade — MySQL アップグレードのテーブル チェック」
に説明のある、MySQL AB
で規定されている方法を利用する以外は、mysql
データベース内のテーブルは、どんな方法でも絶対に変更してはいけません。
テーブル、カラム、ルーチンの権限は、各権限レベルの権限の論理的な
OR
として相加的に形成されています。例えば、もし
mysql.user
テーブルが、ユーザはグローバル
SELECT
権限を持つ、と指定すると、その権限はデータベース、テーブル、またはカラムレベルのエントリによって否定する事はできません。
カラムの権限は次のように計算する事ができます。
global privileges OR (database privileges AND host privileges) OR table privileges OR column privileges OR routine privileges
ほとんどの場合、たった1つの権限レベルでユーザに対して権利を供与する為、実際にはこれほど複雑では有りません。権限チェックの方法の詳細については、項4.7. 「MySQL アクセス権限システム」 で紹介されています。
もし mysql.user
テーブルに存在しないユーザ名/ホスト名の組み合わせに権限を供与するのであれば、エントリが追加されそれは
DELETE
ステートメントで削除されるまでそこに残ります。言い換えると、GRANT
は user
テーブル
エントリを作成するかもしれませんが、REVOKE
はそれらを削除しません。 従ってそれは
DROP USER
か DELETE
を明示的に利用して行わなければいけません。
警告:もし新しいユーザを作成して
IDENTIFIED BY
条項を指定しないと、そのユーザはパスワードを持ちません。これはとても不安定です。しかし、新規ユーザに空ではないパスワードを提供する為に
IDENTIFIED BY
が与えられない限り、GRANT
が新規ユーザを作成するのを防ぐ為に
NO_AUTO_CREATE_USER
SQL
モードを有効にする事ができます。
MySQL Enterprise. MySQL ネットワーク モニタリングとアドバイス サービスは、パスワードが無いユーザ アカウントを明確に防いでいます。更なる情報については、http://www-jp.mysql.com/products/enterprise/advisors.html を参照してください。
もし新規ユーザが作成されたり、グローバル供与権限を持っていたら、ユーザのパスワードは、IDENTIFIED
BY
条項があればそれによって指定された物に設定されます。もしユーザが既にパスワードを持っていたら、それは新しい物と置き換えられます。
パスワードは SET PASSWORD
ステートメントで設定する事もできます。詳しくは
項12.5.1.6. 「SET PASSWORD
構文」 を参照してください。
IDENTIFIED BY
条項内では、パスワードは直定数パスワード値でなければいけません。PASSWORD()
関数を SET PASSWORD
ステートメントに対する時と同じように使用する必要はありません。例:
GRANT ... IDENTIFIED BY 'mypass';
もしパスワードを明確なテキストで送信したく無い場合、PASSWORD()
がそのパスワードに返すハッシュ化された値が分かっていれば、キーワード
PASSWORD
の前にハッシュ化された値を指定する事ができます。
GRANT ... IDENTIFIED BY PASSWORD '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4';
C
プログラムの中では、make_scrambled_password()
C API
関数を利用する事で、ハッシュ化された値を得る事ができます。
もしデータベースに権限を供与すると、mysql.db
テーブル内のエントリが必要に応じて作成されます。もしデータベースの全ての権限が
REVOKE
で削除されると、このエントリも削除されます。
SHOW DATABASES
権限は SHOW
DATABASE
ステートメントを発行する事によって、アカウントがデータベース名を見る事を可能にします。この権限を持たないアカウントは、それらが権限を持つデータベースだけを見て、また、もしサーバが
--skip-show-database
オプションでスタートされていれば、ステートメントを利用する事は全くできません。
MySQL Enterprise.
SHOW DATABASES
権限は、MySQL
サーバ上で全てのデータベースを見る必要があるユーザにだけ与えられます。MySQL
ネットワーク モニタリングとアドバイス
サービスの読者は、サーバが
--skip-show-database
オプション無しでスタートされた時に変更されます。追加情報については
http://www-jp.mysql.com/products/enterprise/advisors.html
を参照してください。
もしユーザがテーブルに何の権限も持たなければ、ユーザがテーブルのリストを要求した時(例えば、SHOW
TABLES
ステートメントを利用して)テーブル名は表示されません。
WITH GRANT OPTION
条項は、ユーザが指定された権限レベルで持つ権限を、別のユーザに与える事ができる機能を与えます。異なる権限を持つ2つのユーザは権限を接合できる事があるので、どのユーザに
GRANT OPTION
権限を与えるのか注意する必要があります。
自分が持たない権限を別のユーザに与える事はできません。GRANT
OPTION
権限によって、自分が持つ権限を割り当てる機能のみ与えられます。
特定の権限レベルでユーザに GRANT
OPTION
権限を与える時は、そのユーザがそのレベルで持つどんな権限も、(または将来与えられる物も)そのユーザから別のユーザに与える事ができるので、注意が必要です。ユーザにデータベース上で
INSERT
権限を与えると仮定してください。その時もし
SELECT
権限をデータベース上で与え、WITH GRANT
OPTION
を指定すると、そのユーザは別のユーザに
SELECT
権限だけではなく
INSERT
も与える事ができます。その時もしデータベース上でユーザに
UPDATE
権限を与えると、そのユーザは
INSERT
、SELECT
、そして
UPDATE
を与える事ができるようになります。
非管理者ユーザに対しては、ALTER
権限をグローバルに与えたり、またはそれを
mysql
データベースに与えたりするべきでは有りません。もしそれをしてしまうと、残りのテーブルによってそのユーザが権限システムを破壊する事が可能になってしまいます!
MAX_QUERIES_PER_HOUR
、count
MAX_UPDATES_PER_HOUR
、そして
count
MAX_CONNECTIONS_PER_HOUR
オプションは、1時間の間にユーザが行う事ができるクエリ、更新、そしてログインの数を制限します。(クエリ
キャッシュから結果が与えられるクエリは
count
MAX_QUERIES_PER_HOUR
制限に対してカウントしません。)もし
count
が 0
なら(デフォルト)、そのユーザには制限がないという意味になります。
MAX_USER_CONNECTIONS
オプションは、そのアカウントが作成する事ができる同時接続の最大数を制限します。もし
count
count
が 0
なら(デフォルト)、max_user_connections
システム変数はそのアカウントの同時接続数を決定します。
注意:既存権限に影響を与えずに、既に存在するユーザにこれらのリソース制限オプションを指定するには、GRANT
USAGE ON *.* ... WITH MAX_...
を利用して下さい。
詳しくは 項4.8.4. 「ユーザ リソースの制限」 を参照してください。
MySQL
は、ユーザ名とパスワードに基づいた通常認証に加え、X509
証明拡張子を確認する事ができます。 SSL
関連オプションを MySQL
アカウントに指定するには GRANT
ステートメントの REQUIRE
条項を利用してください。(MySQL を利用した SSL
利用の背景情報については、項4.8.7. 「接続安全」
を参照してください。)
与えられたアカウントの接続を制限するには、いくつかの異なる方法があります。
REQUIRE NONE
は、アカウントが
SSL や X509
要求を持たないという事を指示します。もし
SSL 関連 REQUIRE
オプションが指定されれば、これがデフォルトになります。もしユーザ名とパスワードが有効なら、暗号化されていない接続が許可されます。しかし、クライアントのオプションにより、もしそのクライアントが正しい証明とキー
ファイルを持っていれば、暗号化された接続もまた利用できます。それは、クライアントは
SSL
コマンドオプションを指定する必要がなく、その場合接続は暗号化されていない物になる、という事です。暗号化された接続を利用するには、クライアントは
--ssl-ca
オプションか、または
--ssl-ca
、--ssl-key
、または
--ssl-cert
オプションの3つ全てを指定する必要があります。
REQUIRE SSL
オプションは、サーバに対して、SSL
暗号化接続だけをアカウントに許容するよう指示を出します。
GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' IDENTIFIED BY 'goodsecret' REQUIRE SSL;
接続するには、クライアントは
--ssl-ca
オプションを指定し、また追加で
--ssl-key
と --ssl-cert
オプションを指定する必要があります。
REQUIRE X509
は、クライアントが有効な証明書を持つ必要があるが、その証明書、発行者、そして題目は何でもかまわないという事を意味します。要求されるのは、CA
証明の1つによってそのサインを検証できなければいけない、という事だけです。
GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' IDENTIFIED BY 'goodsecret' REQUIRE X509;
接続するには、クライアントは
--ssl-ca
、--ssl-key
、--ssl-cert
オプションを指定する必要があります。
これは REQUIRE
オプションが
X509
の意味を含む為、ISSUER
と
SUBJECT
にとっても同じ事が言えます。
REQUIRE ISSUER
'
は、クライアントが CA
issuer
''
によって発行された有効な X509
証明を提示するよう、接続に制限を与えます。もしクライアントが、有効ではあるが異なる発行者による証明を提示したら、サーバは接続を拒否します。X509
証明の利用は、必ず暗号化を暗示しますので、issuer
'SSL
オプションはこの場合必要ありません。
GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' IDENTIFIED BY 'goodsecret' REQUIRE ISSUER '/C=FI/ST=Some-State/L=Helsinki/ O=MySQL Finland AB/CN=Tonu Samuel/Email=tonu@example.com';
'
値は単一文字列として入力されなければいけない事を覚えておいて下さい。
issuer
'
REQUIRE SUBJECT
'
は、クライアントがサブジェクト
subject
'subject
を含む有効な X509
証明を提示する接続に制限を与えます。もしクライアントが、有効ではあるが異なるサブジェクトによる証明を提示したら、サーバは接続を拒否します。
GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' IDENTIFIED BY 'goodsecret' REQUIRE SUBJECT '/C=EE/ST=Some-State/L=Tallinn/ O=MySQL demo client certificate/ CN=Tonu Samuel/Email=tonu@example.com';
'
値は単一文字列として入力されなければいけない事を覚えておいて下さい。
subject
'
REQUIRE CIPHER
'
は十分な強さの暗号とキー長さが利用される事が保証されていなければいけません。SSL
自体は、短い暗号キーを利用している古いアルゴリズムが利用されると、弱くなる事があります。このオプションを利用すると、接続を許可する為に特定の暗号方法が利用されるように依頼する事ができます。
cipher
'
GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' IDENTIFIED BY 'goodsecret' REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA';
SUBJECT
、ISSUER
、そして
CIPHER
オプションを、次のように
REQUIRE
条項の中で組み合わせる事ができます。
GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' IDENTIFIED BY 'goodsecret' REQUIRE SUBJECT '/C=EE/ST=Some-State/L=Tallinn/ O=MySQL demo client certificate/ CN=Tonu Samuel/Email=tonu@example.com' AND ISSUER '/C=FI/ST=Some-State/L=Helsinki/ O=MySQL Finland AB/CN=Tonu Samuel/Email=tonu@example.com' AND CIPHER 'EDH-RSA-DES-CBC3-SHA';
AND
キーワードは
REQUIRE
オプションとの間では任意です。
オプションの順番は重要では有りませんが、2回指定できるオプションはありません。
mysqld がスタートする時、全ての権限はメモリの中に読み込まれます。詳細に関しては 項4.7.7. 「権限の変更が反映するタイミング」 を参照して下さい。
1つのユーザに対してテーブル、カラム、またはルーチン権限を利用していると、サーバはテーブル、カラム、そしてルーチン権限を全てのユーザに対して分析し、その為に MySQL のスピードが少し遅くなります。同じように、もしユーザに対してクエリ、更新または接続の数を制限すると、サーバはそれらの値を監視しなければいけません。
SQL と MySQL GRANT
バージョンとの最大の違いは次のような物です。
MySQL では、権限はユーザ名だけではなく、ホスト名とユーザ名の組み合わせと関連しています。
スタンダード SQL はグローバル、またはデータベース レベル権限を持たず、MySQL がサポートする全ての権限タイプのサポートもしません。
MySQL はスタンダード SQL UNDER
権限をサポートしません。
スタンダード SQL
権限は、階層的な様式で構造されています。もしユーザを削除すると、そのユーザが持つ全ての権限が与えられ、削除されます。もし
DROP USER
を利用するなら、MySQL
でも同じです。詳しくは
項12.5.1.2. 「DROP USER
構文」 を参照してください。
スタンダード SQL
では、テーブルをドロップすると、そのテーブルの全ての権限は削除されます。スタンダード
SQL
では、権限を削除すると、その権限に基づいて与えられた全ての権限もまた削除されます。MySQL
では、明示的な REVOKE
ステートメントだけの利用、または MySQL
供与テーブル内に格納された値の複製でドロップできます。
MySQL
では、テーブル内のいくつかのカラムに対してだけ
INSERT
権限を持つ事が可能です。この場合、INSERT
権限を持っていないそれらのカラムを削除するのであれば、テーブル上で
INSERT
ステートメントを実行する事ができます。削除されたカラムは、もしストリクト
SQL
モードが有効でなければ、暗黙的なデフォルト値に設定されます。ストリクト
モードでは、もし削除されたカラムがデフォルト値を持たなければ、ステートメントは却下されます。(スタンダード
SQL は、全てのカラムに INSERT
権限を持つように要求します。)項4.2.6. 「SQL モード」
で、ストリクト
モードについて説明されています。項10.1.4. 「データタイプデフォルト値」
で暗黙のデフォルト値について説明されています。