• 1
  • 2
  • 3
  • 4
  • 5
mysql数据库问题 首 页  »  帮助中心  »  数据库  »  mysql数据库问题
关于RDS for mysql Definer字段的设置的相关事项
发布日期:2015-11-7 13:11:24

  关于RDS for mysql Definer字段的设置的相关事项

  在RDS上执行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、DEFINER指定的用户必须是mysql.user表中存在的用户(上述描述的是存储程序和视图默认是Definer模式,如果是INVOKER模式下,在存储过程执行时,会检查存储过程调用者的权限);2、调用存储程序的用户必须有存储程序的EXECUTE权限。  

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

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


       2. 用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。如下图:


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