我在MySQL手册中发现DEFINER的解释令人困惑,因此我不确定应用程序运行所在的“执行用户”需要什么特权。为了安全起见,我喜欢将“执行用户”限制为所需的最少权限。
我理解触发器/存储过程的创建者需要SUPER权限,但“执行用户”是否也需要SUPER权限?
我在用户下创建了一个触发器,最终失去了对我的数据库的权限。 “执行用户”没有SUPER权限和触发失败的MySQL UPDATE。
我给'执行用户'提供了SUPER权限,我通过删除和创建触发器将DEFINER更改为root,这一切都有效。我是否必须为'执行用户'提供SUPER权限,还是我必须确保DEFINER用户仍在使用且具有超级权限?
针对MySQL的TRIGGERS和STORED PROCEDURES用户管理的最佳做法是什么?
答案 0 :(得分:4)
区分存储的例程和触发器有一些特殊性。在这里,我将尝试帮助解决触发器问题。
我希望以下摘要有用。
首先要确定您正在使用的MySQL版本。
根据文件:
MySQL 5.0:13.1.11. CREATE TRIGGER Syntax
从MySQL 5.0.17开始,MySQL将DEFINER用户考虑在内 检查触发器权限如下:
在CREATE TRIGGER时间,发出声明的用户必须具有SUPER权限。
在触发器激活时,将根据DEFINER用户检查权限。该用户必须具有以下权限:
SUPER特权。
如果使用触发器主体中的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. CREATE TRIGGER Syntax
MySQL在检查触发器时会考虑DEFINER用户 特权如下:
在CREATE TRIGGER时间,发出声明的用户必须具有TRIGGER权限。 (在MySQL 5.1.6之前的SUPER。)
在触发器激活时,将根据DEFINER用户检查权限。该用户必须具有以下权限:
TRIGGER特权。 (在MySQL 5.1.6之前的SUPER。)
如果使用触发器主体中的OLD.col_name或NEW.col_name对表列进行引用,则为主题表的SELECT权限。
如果表格列是SET NEW.col_name =触发器正文中的值分配的目标,则主题表的UPDATE权限。
触发器执行的语句通常需要其他任何权限。