在 MySQL 中执行触发器需要什么权限?

sdf*_*for 4 mysql triggers

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

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

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

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

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

wch*_*ito 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 特权。

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