MySQL 権限システムは、すべてのユーザがそれぞれ許可された操作だけを実行できるようにします。MySQL サーバに接続すると、ユーザの ID は接続元のホストおよび指定したユーザ名によって特定されます。権限システムは、ユーザ ID と行いたい操作に応じて権限を設定します。
        MySQL
        では、ホスト名とユーザ名を使用してユーザを認証します。1
        つのユーザ名がインターネット上のどこででも同じユーザを示しているという保証がないためです。たとえば、office.com
        から接続したユーザ joe
        は、elsewhere.com から接続した
        joe と同一人物とは限りません。
        MySQL
        では、同じユーザ名でも異なるホストから接続するユーザ間で区別することにより、このことを処理しています。joe
        に対して、office.com
        から接続した場合の権限セットと、elsewhere.com
        から接続した場合の権限セットを別々に設定できます。
      
MySQL のアクセス制御には 2 段階があります。
段階 1: ユーザに接続する権限があるかどうかサーバがチェックする。
            段階 2:
            接続できた場合、要求ごとにそれを実行できる権限があるかどうかサーバがチェックする。たとえば、データベースのあるテーブルからレコードを
            SELECT したり、データベースのテーブルを DROP
            しようとすると、ユーザにそのテーブルの
            SELECT
            権限があるかどうか、あるいはデータベースの
            DROP
            権限があるかどうかをサーバがチェックする。
          
注意: 接続中に権限が変更された場合(ユーザ自身または第三者によって)、必ずしもその変更は次のクエリに反映されません。詳細については、項4.4.3. 「権限の変更はいつ反映されるか」 を参照してください。
        サーバはアクセス制御の両方の段階で、mysql
        データベースの
        user、db、host
        の各テーブルを使用します。これらの権限テーブルのフィールドを以下に示します。
      
| テーブル名 | user | db | host | 
| スコープフィールド | Host | Host | Host | 
| User | Db | Db | |
| Password | User | ||
| 権限フィールド | Select_priv | Select_priv | Select_priv | 
| Insert_priv | Insert_priv | Insert_priv | |
| Update_priv | Update_priv | Update_priv | |
| Delete_priv | Delete_priv | Delete_priv | |
| Index_priv | Index_priv | Index_priv | |
| Alter_priv | Alter_priv | Alter_priv | |
| Create_priv | Create_priv | Create_priv | |
| Drop_priv | Drop_priv | Drop_priv | |
| Grant_priv | Grant_priv | Grant_priv | |
| References_priv | References_priv | References_priv | |
| Reload_priv | |||
| Shutdown_priv | |||
| Process_priv | |||
| File_priv | |||
| Show_db_priv | |||
| Super_priv | |||
| Create_tmp_table_priv | Create_tmp_table_priv | Create_tmp_table_priv | |
| Lock_tables_priv | Lock_tables_priv | Lock_tables_priv | |
| Execute_priv | |||
| Repl_slave_priv | |||
| Repl_client_priv | |||
| ssl_type | |||
| ssl_cypher | |||
| x509_issuer | |||
| x509_cubject | |||
| max_questions | |||
| max_updates | |||
| max_connections | 
        アクセス制御の 2
        段階目(要求確認)で、要求がテーブルに関連するものである場合、サーバがさらに
        tables_priv テーブルおよび
        columns_priv
        テーブルを参照することがあります。これらのテーブルのフィールドを以下に示します。
      
| テーブル名 | tables_priv | columns_priv | 
| スコープフィールド | Host | Host | 
| Db | Db | |
| User | User | |
| Table_name | Table_name | |
| Column_name | ||
| 権限フィールド | Table_priv | Column_priv | 
| Column_priv | ||
| その他のフィールド | Timestamp | Timestamp | 
| Grantor | 
各権限テーブルには、スコープフィールドと権限フィールドがあります。
        スコープフィールドは、テーブルの各登録の範囲を特定します。たとえば、Host
        と User の値が
        'thomas.loc.gov' および
        'bob' である user
        テーブルエントリは、thomas.loc.gov
        ホストからサーバに接続しようとする
        bob
        を認証します。同様に、Host、User、Db
        の各フィールドの値が
        'thomas.loc.gov'、'bob'、および
        'reports' である db
        テーブルエントリは、thomas.loc.gov
        ホストから reports
        データベースに接続しようとする
        bob
        を認証します。tables_priv
        テーブルおよび columns_priv
        テーブルには、各エントリに許可されているテーブルまたはテーブルとカラムの組み合わせを示すスコープフィールドが含まれています。
      
        アクセスをチェックする目的において、Host
        値は大文字と小文字の区別がありません。User、Password、Db、および
        Table_name
        の値については大文字と小文字が区別されます。
        Column_name 値は、MySQL バージョン
        3.22.12
        以降では大文字と小文字が区別されなくなっています。
      
権限フィールドは、テーブル内のエントリごとに設定されている権限、つまり何の操作を実行できるかを示します。サーバはさまざまな権限テーブルの情報を組み合わせて、ユーザの権限についての完全な記述を生成します。 この動作に適用されるルールについては、項4.3.10. 「アクセス制御の段階 2: 要求確認」 を参照してください。
スコープフィールドは文字列です。ここで示されているように、それぞれのデフォルト値は空の文字列です。
| フィールド名 | 型 | 注意 | 
| Host | CHAR(60) | |
| User | CHAR(16) | |
| Password | CHAR(16) | |
| Db | CHAR(64) | ( tables_privテーブルおよびcolumns_privテーブルではCHAR(60)) | 
| Table_name | CHAR(60) | |
| Column_name | CHAR(60) | 
        user、db、host
        の各テーブルでは、すべての権限フィールドが
        ENUM('N','Y')
        として宣言されます。それぞれの値は
        'N' または 'Y'
        で、デフォルト値は 'N' です。
      
        tables_priv テーブルおよび
        columns_priv
        テーブルでは、権限フィールドは
        SET
        フィールドとして宣言されます。
      
| テーブル名 | フィールド名 | 設定可能な要素 | 
| tables_priv | Table_priv | 'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop',
                'Grant', 'References', 'Index', 'Alter' | 
| tables_priv | Column_priv | 'Select', 'Insert', 'Update', 'References' | 
| columns_priv | Column_priv | 'Select', 'Insert', 'Update', 'References' | 
以下、サーバが権限テーブルをどのように使用するか簡潔に説明します。
            user
            テーブルのスコープフィールドにより、着信した接続を許可するか拒否するか決定する。許可された接続について、user
            テーブルに設定されている権限はいずれも、そのユーザのグローバル(スーパーユーザ)権限になる。
            これらの権限は、サーバのすべてのデータベースに適用される。
          
            db テーブルと
            host
            テーブルは一緒に使用される。
          
                db
                テーブルのスコープフィールドにより、どのユーザがどのホストからどのデータベースにアクセスできるかを決定する。権限フィールドから、何の操作が許可されているか判断する。
              
                host テーブルは、任意の
                db
                テーブルエントリをいくつかのホストに適用する場合、db
                テーブルを補完するものとして使用される。たとえば、1
                人のユーザにネットワーク内のいくつかのホストからデータベースへアクセスすることを許可する場合、ユーザの
                db テーブルエントリの
                Host
                値を空白のままにしておき、それらのホストの各エントリを
                host
                テーブルに入力する。このメカニズムの詳細については、項4.3.10. 「アクセス制御の段階 2: 要求確認」を参照のこと。
              
            tables_priv テーブルおよび
            columns_priv テーブルは
            db
            テーブルに似ているが、より詳細な設定が可能。データベースレベルではなく、テーブルおよびカラムレベルで適用される。
          
        注意:
        管理者権限(RELOAD、SHUTDOWN
        など)は、user
        テーブルでのみ指定します。管理操作はデータベース固有ではなく、サーバそのもので行う操作なので、この権限を他の権限テーブルで設定する必要はありません。実際、管理操作を実行できるかどうか決定する際には、user
        テーブルを参照するだけで済みます。
      
        FILE 権限も user
        テーブルだけで指定します。
        これは管理者権限ではありませんが、サーバホスト上でのファイルの読み書きは、アクセスしているデータベースに依存しません。
      
        mysqld
        サーバは権限テーブルの内容を、起動時に 1
        回読み取ります。権限テーブルへの変更の反映については、項4.4.3. 「権限の変更はいつ反映されるか」
        を参照してください。
      
        権限テーブルの内容を変更する場合、その変更によって、目的の権限が適切に設定されていることを確認してください。問題診断のヘルプについては、項4.3.12. 「Access denied エラーの原因」
        を参照してください。セキュリティに関するアドバイスについては、項4.3.2. 「MySQL のクラッカー対策」
        を参照してください。
      
        便利な診断ツールとして、mysqlaccess
        スクリプトがあります。これは、Yves Carlier が
        MySQL
        ディストリビューション用に提供したものです。このツールの動作を確認したい場合には、mysqlaccess
        を --help
        オプションで起動してください。 注意:
        mysqlaccess は
        user、db、および
        host
        テーブルだけを使用してアクセスをチェックします。テーブルまたはカラムレベルの権限はチェックしません。
      
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.

