4

我发现 MySQL 手册中对 DEFINER 的解释令人困惑,因此我不确定运行应用程序的“执行用户”需要哪些权限。为了安全起见,我喜欢将“执行用户”限制为所需的最少权限。

我知道触发器/存储过程的创建者需要超级权限,但“执行用户”是否也需要超级权限?

我在最终失去数据库权限的用户下创建了一个触发器。“执行用户”没有 SUPER 权限,并且具有触发器的 MySQL UPDATE 失败。

我为“执行用户”提供了超级权限,并通过删除和创建触发器将 DEFINER 更改为 root,一切正常。我是否必须为“执行用户”授予超级权限,还是必须确保 DEFINER 用户仍然存在并拥有超级权限?

使用 MySQL 的触发器和存储过程进行用户管理的最佳实践是什么?

4

1 回答 1

5

存储例程和触发器之间有一些区别。在这里,我将尝试帮助解决触发器的问题。

我希望以下总结对您有所帮助。

首先是确定您使用的 MySQL 版本。

根据文档:

MySQL 5.0:13.1.11。创建触发器语法

从 MySQL 5.0.17 开始,MySQL 在检查触发器权限时会考虑 DEFINER 用户,如下所示:

  • 在 CREATE TRIGGER 时,发出语句的用户必须具有 SUPER 权限。

  • 在触发器激活时,会针对 DEFINER 用户检查权限。此用户必须具有以下权限:

    • 超级特权。

    • 如果在触发器主体中使用 OLD.col_name 或 NEW.col_name 出现对表列的引用,则主题表的 SELECT 权限。

    • 如果表列是触发器主体中的 SET NEW.col_name = 值分配的目标,则为主题表的 UPDATE 特权。

    • 触发器执行的语句通常需要任何其他权限。

在 MySQL 5.0.17 之前,DEFINER 不可用,MySQL 检查触发权限如下:

  • 在 CREATE TRIGGER 时,发出语句的用户必须具有 SUPER 权限。

  • 在触发器激活时,将针对其操作导致触发器被激活的用户检查权限。此用户必须具有触发器执行的语句通常所需的任何权限。

MySQL 5.1 及更高版本:13.1.19。创建触发器语法

MySQL 在检查触发器权限时会考虑 DEFINER 用户,如下所示:

  • 在 CREATE TRIGGER 时,发出语句的用户必须具有 TRIGGER 权限。(在 MySQL 5.1.6 之前超级。)

  • 在触发器激活时,会针对 DEFINER 用户检查权限。此用户必须具有以下权限:

    • TRIGGER 权限。(在 MySQL 5.1.6 之前超级。)

    • 如果在触发器主体中使用 OLD.col_name 或 NEW.col_name 出现对表列的引用,则主题表的 SELECT 权限。

    • 如果表列是触发器主体中的 SET NEW.col_name = 值分配的目标,则为主题表的 UPDATE 特权。

    • 触发器执行的语句通常需要任何其他权限。

于 2013-11-06T21:24:29.363 回答