为什么我无法创建此聚合函数?
据我所知,我已经在*.*
和我的数据库(peacock
)上授予了适当的权限(CREATE ROUTINE
和ALTER 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
。