在MySQL中,执行触发器需要哪些权限?

4
我发现MySQL手册中关于DEFINER的解释令人困惑,因此我不确定应用程序运行时“执行用户”需要哪些权限。出于安全考虑,我希望将“执行用户”的权限限制在最少必要的范围内。
我了解到,触发器/存储过程的创建者需要具有SUPER权限,但是“执行用户”是否也需要SUPER权限呢?
我在一个最终失去对我的数据库权限的用户下创建了一个触发器。 “执行用户”没有SUPER权限,导致一个MySQL UPDATE失败。
我为“执行用户”授予了SUPER权限,并通过删除和创建触发器将DEFINER更改为root,现在一切正常。我必须给予“执行用户”SUPER权限吗?或者我必须确保DEFINER用户仍然存在并具有SUPER权限?
使用TRIGGERS和STORED PROCEDURES管理用户的最佳实践是什么?
1个回答

6
有一些特别之处区分存储过程和触发器。在这里,我将尝试帮助解决关于触发器的问题。
我希望以下概述对您有所帮助。
首先确定您正在使用的MySQL版本。
根据文档:
MySQL 5.0:13.1.11. CREATE TRIGGER Syntax 从MySQL 5.0.17开始,MySQL在检查触发器权限时将DEFINER用户考虑在内,具体如下:
- 创建触发器时,发出语句的用户必须拥有SUPER特权。 - 在触发器激活时,根据DEFINER用户检查权限。该用户必须具备以下权限:
- SUPER 特权。 - 如果在触发器正文中使用OLD.col_name或NEW.col_name引用表列,则对主题表具有SELECT特权。 - 如果表列是SET NEW.col_name = value赋值的目标,则对主题表具有UPDATE特权。 - 执行触发器的语句通常需要的其他任何权限。
在MySQL 5.0.17之前,DEFINER不可用,MySQL会像这样检查触发器权限:
- 创建触发器时,发出语句的用户必须拥有SUPER特权。 - 在触发器激活时,将根据导致触发器激活的操作的用户检查权限。该用户必须拥有执行触发器时通常需要的任何权限。
MySQL 5.1及以上:13.1.19. CREATE TRIGGER Syntax MySQL在检查触发器权限时将DEFINER用户考虑在内,具体如下:
- 创建触发器时,发出语句的用户必须拥有TRIGGER特权(在MySQL 5.1.6之前是SUPER)。 - 在触发器激活时,根据DEFINER用户检查权限。该用户必须具备以下权限:
- TRIGGER特权(在MySQL 5.1.6之前是SUPER)。 - 如果在触发器正文中使用OLD.col_name或NEW.col_name引用表列,则对主题表具有SELECT特权。 - 如果表列是SET NEW.col_name = value赋值的目标,则对主题表具有UPDATE特权。 - 执行触发器的语句通常需要的其他任何权限。

谢谢,因此使用一个始终存在的DEFINER是有意义的。因此,在多数据库服务器中,我可以为每个数据库使用不同的DEFINER,或者始终使用“root”作为DEFINER。我认为使用“root”会更少出现应用程序失败的风险,因为DEFINER消失了。 - sdfor
@sdfor,触发器总是有一个“DEFINER”并在该上下文中运行,也许使用用户“root”定义触发器会给予比其需要的更多权限,出于安全考虑,建议使用具有最小所需权限的用户定义触发器。 - wchiquito

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接