为什么我无法创建此聚合函数?
据我所知,我已在CREATE ROUTINE
和我的数据库(ALTER ROUTINE
)上授予了相应的权限(*.*
和peacock
):< / p>
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
上授予权限,但仍然拒绝访问。答案 0 :(得分:2)
CREATE [AGGREGATE] FUNCTION function_name
RETURNS {STRING|INTEGER|REAL|DECIMAL}
SONAME shared_library_name;
这是User Defined Function的声明,似乎是您要安装的内容。这是不声明Stored Function。 MySQL中CREATE FUNCTION
有two different uses。这是其中之一。
为此起作用:
CREATE ROUTINE
权限AVG()
和SUM()
以及MIN()
和MAX()
。13.7.3.1。 CREATE FUNCTION用户定义函数的语法
要创建函数,您必须具有mysql数据库的
INSERT
权限。这是必要的,因为CREATE FUNCTION
向记录函数名称,类型和共享库名称的mysql.func
系统表添加了一行。- http://dev.mysql.com/doc/refman/5.6/en/create-function-udf.html
如果您没有此权限,则该功能必须由拥有此权限的人员安装,否则需要授予您。你不能把它给自己。
答案 1 :(得分:0)
来自the manual:
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
。