Privilege for CREATE AGGREGATE FUNCTION



为什么我无法创建此聚合函数?

据我所知,我已经在*.*和我的数据库(peacock)上授予了适当的权限(CREATE ROUTINEALTER ROUTINE):

mysql> SELECT User, Host, Create_priv, Create_routine_priv, Alter_routine_priv FROM mysql.user WHERE user='glpy';
+------+-----------+-------------+---------------------+--------------------+
| User | Host      | Create_priv | Create_routine_priv | Alter_routine_priv |
+------+-----------+-------------+---------------------+--------------------+
| glpy | localhost | Y           | Y                   | Y                  |
+------+-----------+-------------+---------------------+--------------------+
mysql> SELECT User, Host, db, Create_priv, Create_routine_priv, Alter_routine_priv FROM mysql.db WHERE user='glpy';
+------+-----------+---------+-------------+---------------------+--------------------+
| User | Host      | db      | Create_priv | Create_routine_priv | Alter_routine_priv |
+------+-----------+---------+-------------+---------------------+--------------------+
| glpy | localhost | peacock | N           | Y                   | Y                  |
+------+-----------+---------+-------------+---------------------+--------------------+

然而,当我尝试创建函数时,我得到了Access denied ... to database 'mysql':

mysql> use peacock;
mysql> CREATE AGGREGATE FUNCTION coverage RETURNS INT SONAME 'my-library.so';
ERROR 1044 (42000): Access denied for user 'glpy'@'localhost' to database 'mysql'

特别是:

  • 为什么创建聚合函数需要访问mysql
  • 既然我已经授予了*.*的权限,为什么访问被拒绝
  • 我还尝试授予mysql的权限,但访问仍然被拒绝
CREATE [AGGREGATE] FUNCTION function_name 
RETURNS {STRING|INTEGER|REAL|DECIMAL}
SONAME shared_library_name;

这是用户定义函数的声明,它似乎是您要安装的。这不是声明存储函数。CREATE FUNCTION在MySQL中有两种不同的用途。这是其中之一。

为此:

  • 您不需要CREATE ROUTINE权限
  • 您所在的数据库并不重要,因为与存储函数不同,用户定义函数的作用域是全局的。它们以类似于其内置聚合函数的方式扩展MySQL功能,如AVG()SUM()以及MIN()MAX()
  • 不能将数据库指定为函数声明的一部分
  • 以下是您缺少的要求:

13.7.3.用户定义函数的CREATE FUNCTION语法

要创建一个函数,您必须拥有mysql数据库的INSERT权限。这是必要的,因为CREATE FUNCTION会在mysql.func系统表中添加一行,记录函数的名称、类型和共享库名称。

--http://dev.mysql.com/doc/refman/5.6/en/create-function-udf.html

如果您没有此权限,则必须由拥有此权限的人安装该功能,否则需要将其授予您。你不能把它授予自己。

来自手册:

CREATE PROCEDURE和CREATE FUNCTION需要CREATE ROUTINE权限。

请确保该权限位于您尝试使用的数据库上。当您运行CREATE AGGREGATE FUNCTION coverage RETURNS INT SONAME 'my-library.so';时,您正试图在mysql数据库(即实际名为mysql的系统数据库)中创建函数,因此您需要对该数据库拥有CREATE ROUTINE权限。如果您试图在其他数据库中创建它,请运行USE my_database命令或修改语法:

CREATE AGGREGATE FUNCTION my_database.coverage RETURNS INTEGER SONAME 'my-library.so';

如果您在一个共享环境中(除了VPS或专用服务器之外,几乎没有其他任何东西),您可能无法对mysql数据库执行任何操作,而且永远不会。因此,在您自己的数据库中创建函数。

编辑:INT应为INTEGER

相关内容

  • 没有找到相关文章

最新更新