如何检查当前用户是否对 MySQL/MariaDB 具有特定权限?

How can I check if current user has certain privilege on MySQL/MariaDB?

我怎样才能轻松检查我的当前用户是否有特定权限,例如如果他可以 运行 以下语句:

INSERT INTO testdb (id) VALUES ('1');

当然,我可以试一试,但我需要这些信息才能知道要插入什么。因为我没有删除权限,所以输入任何内容都不起作用。 使用 SHOW GRANTS; 对我来说还不够,因为它会非常复杂,因为我可以在很多方面拥有一定的特权,例如直接,通过一个角色,只为我的主人等..

有没有更简单的方法来检查我的权限?

非常感谢!

评论中提到的 begin/rollback 方法可能很昂贵,不适用于非事务性存储引擎。

MariaDB 和 MySQL 都提供了准备好的语句,您只是不执行它们。在准备过程中,服务器已经检查了权限并将 return 一个错误。

C 中的示例:

const char *stmt_str= "INSERT INTO t2 VALUES (?)";
if (mysql_stmt_prepare(stmt, stmt_str, strlen(stmt_str))
{
  printf("Error: %s\n", mysql_stmt_error(stmt));
}

SQL中的示例:

mysql> prepare my from "insert into t2 values (?)";
ERROR 1142 (42000): INSERT command denied to user 'foo'@'localhost' for table 't2'

然而,此解决方案是有限的,因为并非所有 SQL 语句都可以准备。允许的语句列表可以在 MariaDB Documentation.

中找到

如果准备命令成功,请不要忘记释放准备好的语句。

如果您只需要检查 SELECT、INSERT、UPDATE、DELETE 权限,您还可以使用同样检查权限的 EXPLAIN 命令。

您可以使用 INFORMATION_SCHEMA 根据需要执行的操作查询所需的权限。

SELECT IF(COUNT(*) > 0, TRUE, FALSE) AS Allowed
FROM INFORMATION_SCHEMA.USER_PRIVILEGES
WHERE GRANTEE LIKE '%user%' AND PRIVILEGE_TYPE = 'INSERT'