create user 'test_user'@'localhost'; create role test_role1; create role test_role2; insert into mysql.roles_mapping (HostFk, UserFk, RoleFk) values ('localhost', 'test_user', 'test_role1'); insert into mysql.roles_mapping (HostFk, UserFk, RoleFk) values ('localhost', 'test_user', 'test_role2'); insert into mysql.roles_mapping (HostFk, UserFk, RoleFk) values ('', 'test_role1', 'test_role2'); select user, host from mysql.user where user not like 'root'; user host test_role1 test_role2 test_user localhost select * from mysql.roles_mapping; HostFk UserFk RoleFk test_role1 test_role2 localhost test_user test_role1 localhost test_user test_role2 flush privileges; select user, host from mysql.db; user host % % grant select on mysql.* to test_role2; flush privileges; show grants; Grants for test_user@localhost GRANT USAGE ON *.* TO 'test_user'@'localhost' GRANT test_role1 TO 'test_user'@'localhost' GRANT test_role2 TO 'test_user'@'localhost' select current_user(), current_role(); current_user() current_role() test_user@localhost NULL set role test_role1; select current_user(), current_role(); current_user() current_role() test_user@localhost test_role1 show grants; Grants for test_user@localhost GRANT SELECT ON `mysql`.* TO 'test_role2' GRANT USAGE ON *.* TO 'test_role1' GRANT USAGE ON *.* TO 'test_role2' GRANT USAGE ON *.* TO 'test_user'@'localhost' GRANT test_role1 TO 'test_user'@'localhost' GRANT test_role2 TO 'test_role1' GRANT test_role2 TO 'test_user'@'localhost' set role none; select current_user(), current_role(); current_user() current_role() test_user@localhost NULL show grants; Grants for test_user@localhost GRANT USAGE ON *.* TO 'test_user'@'localhost' GRANT test_role1 TO 'test_user'@'localhost' GRANT test_role2 TO 'test_user'@'localhost' show grants for test_user@localhost; Grants for test_user@localhost GRANT USAGE ON *.* TO 'test_user'@'localhost' GRANT test_role1 TO 'test_user'@'localhost' GRANT test_role2 TO 'test_user'@'localhost' show grants for test_role1; ERROR 42000: Access denied for user 'test_user'@'localhost' to database 'mysql' show grants for test_role2; ERROR 42000: Access denied for user 'test_user'@'localhost' to database 'mysql' show grants for CURRENT_USER; Grants for test_user@localhost GRANT USAGE ON *.* TO 'test_user'@'localhost' GRANT test_role1 TO 'test_user'@'localhost' GRANT test_role2 TO 'test_user'@'localhost' show grants for CURRENT_USER(); Grants for test_user@localhost GRANT USAGE ON *.* TO 'test_user'@'localhost' GRANT test_role1 TO 'test_user'@'localhost' GRANT test_role2 TO 'test_user'@'localhost' show grants for CURRENT_ROLE; ERROR 42000: There is no such grant defined for user 'test_user' on host 'localhost' show grants for CURRENT_ROLE(); ERROR 42000: There is no such grant defined for user 'test_user' on host 'localhost' set role test_role2; select current_user(), current_role(); current_user() current_role() test_user@localhost test_role2 show grants; Grants for test_user@localhost GRANT SELECT ON `mysql`.* TO 'test_role2' GRANT USAGE ON *.* TO 'test_role2' GRANT USAGE ON *.* TO 'test_user'@'localhost' GRANT test_role1 TO 'test_user'@'localhost' GRANT test_role2 TO 'test_user'@'localhost' show grants for test_user@localhost; Grants for test_user@localhost GRANT USAGE ON *.* TO 'test_user'@'localhost' GRANT test_role1 TO 'test_user'@'localhost' GRANT test_role2 TO 'test_user'@'localhost' show grants for test_role1; Grants for test_role1 GRANT SELECT ON `mysql`.* TO 'test_role2' GRANT USAGE ON *.* TO 'test_role1' GRANT USAGE ON *.* TO 'test_role2' GRANT test_role2 TO 'test_role1' show grants for test_role2; Grants for test_role2 GRANT SELECT ON `mysql`.* TO 'test_role2' GRANT USAGE ON *.* TO 'test_role2' show grants for CURRENT_USER; Grants for test_user@localhost GRANT USAGE ON *.* TO 'test_user'@'localhost' GRANT test_role1 TO 'test_user'@'localhost' GRANT test_role2 TO 'test_user'@'localhost' show grants for CURRENT_USER(); Grants for test_user@localhost GRANT USAGE ON *.* TO 'test_user'@'localhost' GRANT test_role1 TO 'test_user'@'localhost' GRANT test_role2 TO 'test_user'@'localhost' show grants for CURRENT_ROLE; Grants for test_role2 GRANT SELECT ON `mysql`.* TO 'test_role2' GRANT USAGE ON *.* TO 'test_role2' show grants for CURRENT_ROLE(); Grants for test_role2 GRANT SELECT ON `mysql`.* TO 'test_role2' GRANT USAGE ON *.* TO 'test_role2' drop user 'test_user'@'localhost'; revoke select on mysql.* from test_role2; drop role test_role1; drop role test_role2; delete from mysql.roles_mapping where RoleFk='test_role1'; delete from mysql.roles_mapping where RoleFk='test_role2'; flush privileges;