Toddさんのブログにも書いてありますが、MySQL5.7.7からMySQL Proxy Userを利用する事により、
特定のアクセス権限を纏めて、管理する事が出来るようになりました。
複数ユーザー権限をまとめて管理出来るような、ROLEの様な機能になります。

Emulating roles with expanded proxy user

主なメリットとしては、Proxy User(Role)に権限を纏めて付与して、
それぞれの個人アカウントにProxy Userの権限を付与する事により、個別のアカウントに権限を付与しなくても、
まとめて権限管理が出来るので権限付与漏れが無くなる、個別権限付与の手間が省ける、それぞれが個別にアカウントを
継続利用可能なので、共通アカウントを利用しなくても良いのでセキュリティ上管理し易いと言った事が考えられます。
反対に、もし間違えてProxyユーザーから権限を削除してしまったり、余計に権限を付与してしまうと全体に影響が出るので注意が必要です。

検証バージョン


root@localhost [mysql]>select @@version;
+--------------+
| @@version    |
+--------------+
| 5.7.7-rc-log |
+--------------+
1 row in set (0.00 sec)

root@localhost [mysql]>

GRANT PROXY ON 代表ユーザー to 対象ユーザー; で権限を付与
ここでは、proxy_base@localhostが持っている権限をadmin_1@localhostとadmin_2@localhostに付与しています。


root@localhost [mysql]> CREATE USER proxy_base@localhost;
Query OK, 0 rows affected (0.00 sec)

root@localhost [mysql]> CREATE USER admin_1@localhost;
Query OK, 0 rows affected (0.00 sec)

root@localhost [mysql]> CREATE USER admin_2@localhost;
Query OK, 0 rows affected (0.00 sec)

root@localhost [mysql]> GRANT PROXY ON proxy_base@localhost TO admin_1@localhost;
Query OK, 0 rows affected (0.07 sec)

root@localhost [mysql]> GRANT PROXY ON proxy_base@localhost TO admin_2@localhost;
Query OK, 0 rows affected (0.00 sec)

root@localhost [mysql]> GRANT SELECT ON USER01.* TO proxy_base@localhost; 
Query OK, 0 rows affected (0.00 sec)

root@localhost [mysql]> GRANT DELETE ON USER01.* TO proxy_base@localhost;
Query OK, 0 rows affected (0.00 sec)

root@localhost [USER01]>

grants_proxy_user

admin_1がproxy_baseユーザーの持っている権限を実行する事が可能。

[root@misc01 admin]# /usr/local/mysql/bin/mysql -u admin_1 -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.7-rc-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

admin_1@localhost [(none)]> SELECT USER(), CURRENT_USER(), @@session.proxy_user;
+-------------------+----------------------+-----------------------+
| USER()            | CURRENT_USER()       | @@session.proxy_user  |
+-------------------+----------------------+-----------------------+
| admin_1@localhost | proxy_base@localhost | 'admin_1'@'localhost' |
+-------------------+----------------------+-----------------------+
1 row in set (0.00 sec)

admin_1@localhost [(none)]> show variables like '%proxy%';
+-----------------------------------+-----------------------+
| Variable_name                     | Value                 |
+-----------------------------------+-----------------------+
| check_proxy_users                 | ON                    |
| mysql_native_password_proxy_users | ON                    |
| proxy_user                        | 'admin_1'@'localhost' |
| sha256_password_proxy_users       | OFF                   |
+-----------------------------------+-----------------------+
4 rows in set (0.00 sec)

admin_1@localhost [(none)]> SHOW GRANTS;
+----------------------------------------------------------------+
| Grants for proxy_base@localhost                                |
+----------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'proxy_base'@'localhost'                 |
| GRANT SELECT, DELETE ON `USER01`.* TO 'proxy_base'@'localhost' |
+----------------------------------------------------------------+
2 rows in set (0.00 sec)

admin_1@localhost [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| USER01             |
+--------------------+
2 rows in set (0.00 sec)

admin_1@localhost [(none)]>

admin_1@localhost [(none)]> select * from USER01.T_ONLINE_DDL;
+----+-----------------+
| id | text            |
+----+-----------------+
|  1 | Group by Test A |
|  2 | Group by Test A |
|  3 | Group by Test A |
|  4 | Group by Test B |
|  5 | Group by Test B |
|  6 | Group by Test B |
|  7 | Group by Test C |
|  8 | Group by Test C |
|  9 | Group by Test C |
+----+-----------------+
9 rows in set (0.00 sec)

admin_1@localhost [(none)]> 

admin_1@localhost [(none)]> delete from USER01.T_CSV01 where id = 1;
Query OK, 1 row affected (0.00 sec)

admin_1@localhost [(none)]> 

SHOW GRANTSにて権限の確認
grants

オプション設定、権限付与確認
proxy_user

他の、商用DBには以前から実装されているROLE権限ですが、
MySQL5.7RCではMySQL Proxyという方法で同様の権限管理が出来るようになりました。

6.3.10 Proxy Users


権限はMySQLのテーブルからSelectしていたので、
運用している時に利用した事はないけれども一応確認してみた。

[root@HOME001 bin]# ./mysqlaccess localhost slave_user test -u root -p
mysqlaccess Version 2.06, 20 Dec 2000
By RUG-AIV, by Yves Carlier (Yves.Carlier@rug.ac.be)
Changes by Steve Harvey (sgh@vex.net)
This software comes with ABSOLUTELY NO WARRANTY.

Warning: mysqlaccess is deprecated and will be removed in a future version.
Password for MySQL user slave_user:
Password for MySQL superuser root:

Sele Inse Upda Dele Crea Drop Relo Shut Proc File Gran Refe Inde Alte Show Supe Crea Lock Exec Repl Repl Crea Show Crea Alte Crea Even Trig Crea Ssl_ Ssl_ X509 X509 Max_ Max_ Max_ Max_ Plug Auth Pass | Host,User,DB
---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- + --------------------
 Y    Y    Y    Y    Y    Y    N    N    N    N    N    Y    Y    Y    N    N    Y    Y    N    Y    N    Y    Y    Y    N    N    Y    Y    N    ?    ?    ?    ?    0    0    0    0    ?    ?    N   | localhost,slave_user,test
 Y    Y    Y    Y    Y    Y    N    N    N    N    N    Y    Y    Y    N    N    Y    Y    N    N    N    Y    Y    Y    N    N    Y    Y    N    N    N    N    N    N    N    N    N    N    N    N   | localhost,ANY_NEW_USER,test

BUGs can be reported at http://bugs.mysql.com/
[root@HOME001 bin]# 

MYSQLユーザー権限レベルの種類について

「グローバル レベル」

既存サーバ上では、グローバル権限は全てのデータベースに適応します。
これらの権限は 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 テーブル内で格納されます。

GRANT は最大60文字のホスト名をサポートします。
データベース、テーブル、カラム、そしてルーチン名は最大64文字です。
ユーザ名は最大16文字です。
注意:ユーザ名の許容長さは、mysql.user テーブルを変更しても変える事はできません。
もしそれをすると、ユーザが MySQL サーバにログインできなくなってしまうような、
予想不可能な動作に陥る可能性があります。

===============================================================================
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 権限はトリガを作成したりドロップしたりする為に必要でした。)

テーブル、カラム、ルーチンの権限は、各権限レベルの権限の論理的な OR として
相加的に形成されています。例えば、もし mysql.user テーブルが、ユーザはグローバル
SELECT 権限を持つ、と指定すると、その権限はデータベース、テーブル、
またはカラムレベルのエントリによって否定する事はできません。

カラムの権限は次のように計算する事ができます。

global privileges
OR (database privileges AND host privileges)
OR table privileges
OR column privileges
OR routine privileges

=========================
メモ
=========================
※ユーザーがDROPされても接続されているユーザーは、自動的にTERMINATEされません。
※GLOBAL PRIVILEDGEの変更は既に接続している状態のユーザーには影響しません。
次回接続時から反映されます。
※DATABASE権限に関しては、USERが「USE DATABASE」コマンドを実行したときに
反映されます。
※TABLE & COLUMN権限は変更時に即時反映されます。


存在しているユーザーの確認

[root@colinux tmp]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 26
Server version: 5.1.30 MySQL Community Server (GPL)

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.

mysql> use mysql
Database changed
mysql> select user,host,password from mysql.user;
+———-+———–+——————————————-+
| user     | host      | password                                  |
+———-+———–+——————————————-+
| root     | localhost | *N41EFFFE1191DDDD7D3F2B6F5A9CDDD0DDDDDC3D |
| root     | colinux   | *N41EFFFE1191DDDD7D3F2B6F5A9CDDD0DDDDDC3D |
| root     | 127.0.0.1 | *N41EFFFE1191DDDD7D3F2B6F5A9CDDD0DDDDDC3D |
| variable | %         | *N41EFFFE1191DDDD7D3F2B6F5A9CDDD0DDDDDC3D |
+———-+———–+——————————————-+
4 rows in set (0.00 sec)

mysql>

ユーザー権限の確認

mysql> SELECT Host, User, Select_priv, Insert_priv,Update_priv, Delete_priv FROM user;
+———–+———-+————-+————-+————-+————-+
| Host      | User     | Select_priv | Insert_priv | Update_priv | Delete_priv |
+———–+———-+————-+————-+————-+————-+
| localhost | root     | Y           | Y           | Y           | Y           |
| colinux   | root     | Y           | Y           | Y           | Y           |
| 127.0.0.1 | root     | Y           | Y           | Y           | Y           |
| %         | variable | Y           | Y           | Y           | Y           |
+———–+———-+————-+————-+————-+————-+
4 rows in set (0.01 sec)

mysql>

ユーザーとDB毎の権限確認

mysql> select Db,User,Host,Select_priv from db;
+———+——-+———–+————-+
| Db      | User  | Host      | Select_priv |
+———+——-+———–+————-+
| test    |       | %         | Y           |
| test\_% |       | %         | Y           |
| DB02    | admin | localhost | Y           |
+———+——-+———–+————-+
3 rows in set (0.00 sec)

mysql> select Db,User,Host,Select_priv,Insert_priv,Update_priv from db;
+———+——-+———–+————-+————-+————-+
| Db      | User  | Host      | Select_priv | Insert_priv | Update_priv |
+———+——-+———–+————-+————-+————-+
| test    |       | %         | Y           | Y           | Y           |
| test\_% |       | %         | Y           | Y           | Y           |
| DB02    | admin | localhost | Y           | Y           | Y           |
+———+——-+———–+————-+————-+————-+

3 rows in set (0.49 sec)

mysql>

mysql_priv

mysql_priv