RDS for MySQL Definer字段的设置

RDS for MySQL Definer字段的设置

更新时间:2017-06-07 13:26:11

问题描述:  在RDS for MySQL 上执行 MySQL 的存储程序(包括:procedures, functions, triggers和events)和视图的时候经常会遇到如下的错误:

[Err] 1227 - Access denied; you need (at least one of) the SUPER privilege(s) for this operation (常见于MySQL 5.6)
ERROR 1725 (HY000) at line 1936: OPERATION need to be executed set by ADMIN (常见于MySQL 5.5)

问题原因:  这个错误主要是由于执行的对象中定义了Definer字段。用户在创建上述的存储程序或者视图时, 如果指定definer字段, 那么就设置了用户执行该存储程序或视图的权限,该如果没有指定Definer字段的时候会默认指定创建时的用户。如下图,在该图中没有指定definer字段, 创建视图view_1就会生成创建视图的用户。

1.JPG

调用存储程序或者视图的用户想要正常的访问需要有两方面的权限:

1. 调用存储程序的用户必须有存储程序的EXECUTE权限;

2. DEFINER指定的用户必须是mysql.user表中存在的用户(上述描述的是存储程序和视图默认是Definer模式,如果是INVOKER模式下,在存储过程执行时,会检查存储过程调用者的权限)。

在使用过程中经常遇到下述两种情况出现的错误,请注意在修改账号权限或者迁移过程中的存储程序和视图的权限:

1. 用 dctest账号创建存储过程account_count_1并查看其结果,如下图。可以查看到definer是dctest@%,并且为definer 模式。这种情况下使用别的账号执行该存储过程是调用存储过程就会以dctest@%的权限来执行,如果用户通过控制台或者API删除了dctest账号对 dbtest库的写权限的话就会报错:ERROR 1227 (42000): Access denied; you need (at least one of) the SUPER privilege(s) for this operation。

1.JPG

2. 用dctest账号创建存储过程account_count并查看其结果,如下图。存储过程的definer仍然是dctest@%,但是为invoker模式。这种情况哪个账号执行该存储过程就会使用调用者的权限来执行该存储过程。如果调用者没有对应的权限就会报错:execute command denied to user 'XXXXXXX'@'%' for routine 'dbtest.account_count'。

1.JPG

如果问题还未能解决,请联系售后技术支持