我运行一个 MySQL 服务器并且我在这个实例上拥有 MySQL 根级权限:
mysql> select CURRENT_USER();
+----------------+
| CURRENT_USER() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.02 sec)
mysql>
Run Code Online (Sandbox Code Playgroud)
我正在对一系列用户的 MySQL 权限进行故障排除。我不知道这些用户的密码。作为 MySQL root 用户,我可以在不知道密码的情况下假设另一个用户的身份吗?
在 Linux/Unix 世界中,我会使用像“su - someuser”这样的命令来假设用户的身份。MySQL 是否提供等效功能?
您所要求的只能通过两种方式完成
MySQL 5.5 引入代理用户
当通过身份验证插件对 MySQL 服务器进行身份验证时,插件可能会请求将连接(外部)用户视为不同的用户以进行权限检查。这使得外部用户可以成为第二个用户的代理;也就是拥有第二个用户的权限。换句话说,外部用户是“代理用户”(可以冒充或成为其他用户的用户),第二个用户是“代理用户”(其身份可以被代理用户使用的用户) .
您可以在 mysql.proxies_priv 中找到定义的代理用户:
mysql> desc mysql.proxies_priv;
+--------------+------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+------------+------+-----+-------------------+-----------------------------+
| Host | char(60) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Proxied_host | char(60) | NO | PRI | | |
| Proxied_user | char(16) | NO | PRI | | |
| With_grant | tinyint(1) | NO | | 0 | |
| Grantor | char(77) | NO | MUL | | |
| Timestamp | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+--------------+------------+------+-----+-------------------+-----------------------------+
7 rows in set (0.22 sec)
mysql>
Run Code Online (Sandbox Code Playgroud)
CREATE USER 'empl_external'@'localhost'
IDENTIFIED WITH auth_plugin AS 'auth_string';
CREATE USER 'employee'@'localhost'
IDENTIFIED BY 'employee_pass';
GRANT PROXY
ON 'employee'@'localhost'
TO 'empl_external'@'localhost';
Run Code Online (Sandbox Code Playgroud)
在 中mysql.proc
,有一列名为security_type
。对于视图,这存在于information_schema.views
. 它有两个值 1)invoker
和 2) definer
。如果存储过程具有security_type
as definer
,则您具有与存储过程所有者相同的访问权限。当然,这只适用