故意删除 MySQL 'root' 用户会触发其他 MySQL 帐户的 "Access denied"

Deleting the MySQL 'root' user on purpose triggers "Access denied" for other MySQL accounts

我有一个 MySQL 5.6 运行ning 正在生产中,使用了多年的遗留 root 帐户。作为强化计划的一部分,我想删除这个 root 帐户 - 基本上可以通过另一个未命名为 root 的帐户使用它。

在创建了另一个名为 adminacc 且对数据库具有完全访问权限的帐户后,我删除了名为 root 的帐户。 在此操作之后,所有(adminacc 仍然可以登录)我的其他帐户无法再登录,收到以下消息

SQL State 28000 Error 1045: Access denied for user 'XXX'@'wathever' (using password: YES)

我授予被拒绝的帐户对数据库的完全访问权限 - 但没有成功。 我终于重新创建了我的 root 帐户(使用与之前相同的密码,不确定此处是否相关)并且我的数据库帐户又回来了。

一个帐户(会不会是初始 root)和另一个 MySQL 中的帐户之间怎么可能存在依赖关系?会不会是因为我在以 root 用户身份连接时创建了另一个帐户?或者其他帐户正在尝试查询由 root 帐户创建的视图?不信,抛砖引玉想明白。

我发现我的 senario 中最奇怪的是来自被拒绝帐户的连接并没有被完全拒绝。从 Windows odbcad32.exe 实用程序测试连接时,它成功了!但是每当在应用程序上下文中使用时(运行ning 来自同一 windows 主机),它都会失败。

我做了 运行 捕获,这是输出(这是来自应用上下文) 您可以看到登录实际上进行得很好;很少有查询被正确执行(基本上是在会话打开时初始化语句,如 SET NAMES utf8SET SQL_AUTO_IS_NULL = 0)。 然后当用户尝试对其中一个数据库视图执行 SELECT 时抛出错误。

注意:我发现 MySQL 文档中没有关于不删除初始 root 帐户的建议。没有描述这种情况。在互联网上浏览了一下,我找到了 this previous Whosebug question,但仍未得到答复。

如 MySQL 中的 Akina, this issue was tied to Stored Object Access Control 所述。这不仅适用于过程、函数、触发器,还适用于视图,请阅读本文

For stored routines (procedures and functions) and views, the object definition can include an SQL SECURITY characteristic with a value of DEFINER or INVOKER to specify whether the object executes in definer or invoker context. If the definition omits the SQL SECURITY characteristic, the default is definer context.

我的错误实际上会在调用视图时出现(因为所有视图都是通过此 root 帐户创建的,并且 SQL SECURITY 设置为 DEFINER - 默认行为) .

现在很有意义。话虽这么说,MySQL 错误消息本可以更详细地描述实际问题!