CREATE AGGREGATE FUNCTION的特权

时间:2013-12-13 18:16:04

标签: mysql grant

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

据我所知,我已在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上授予权限,但仍然拒绝访问。

2 个答案:

答案 0 :(得分:2)

CREATE [AGGREGATE] FUNCTION function_name 
RETURNS {STRING|INTEGER|REAL|DECIMAL}
SONAME shared_library_name;

这是User Defined Function的声明,似乎是您要安装的内容。这是声明Stored Function。 MySQL中CREATE FUNCTIONtwo different uses。这是其中之一。

为此起作用:

  • 您不需要CREATE ROUTINE权限
  • 您所在的数据库并不重要,因为与存储函数不同,用户定义函数的范围是全局的。它们以类似于其内置聚合函数的方式扩展MySQL功能,例如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