2013-12-13 4 views
1

Почему я не могу создать эту агрегатную функцию?Привилегия для CREATE AGGREGATE FUNCTION

Насколько я могу сказать, что я предоставил соответствующие права (CREATE ROUTINE и ALTER ROUTINE) как на *.* и на моей базе данных (peacock):

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, но доступ по-прежнему отрицался.

ответ

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

Это объявление для User Defined Function, который, кажется, что вы пытаетесь установить. Это не Объявление Stored Function. CREATE FUNCTION содержит two different uses в MySQL. Это одна из них.

Для этой работы:

  • вам не нужна CREATE ROUTINE привилегия
  • это не имеет значения, какую базу данных вы находитесь, потому что определяемые пользователем функции, в отличие от хранимых функций, являются глобальными по масштабу , Они расширяют функциональность MySQL таким образом, который аналогичен его встроенным агрегатным функциям, таким как AVG() и SUM() и MIN() и MAX().
  • вы не можете указать базу данных как часть функции декларации
  • следующее является требование, чтобы вам не хватает:

13.7.3.1. CREATE FUNCTION Синтаксис для пользовательских функций

Чтобы создать функцию, вы должны иметь привилегию INSERT для базы данных mysql. Это необходимо, потому что CREATE FUNCTION добавляет строку в системную таблицу mysql.func, которая записывает имя, тип и имя общей библиотеки.

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

Если у вас нет такой привилегии, то функция должна быть установлена ​​кем-то, кто держит эту привилегию, или он должен быть предоставлен вам. Вы не можете это предоставить себе.

+0

Это звучит абсолютно правильно - просто нужно его протестировать. – jmilloy

+0

Конечно, вам нужно «УДАЛИТЬ», чтобы функция «DROP». Благодарю. – jmilloy

0

От the manual:

CREATE PROCEDURE и CREATE FUNCTION требует рутинной привилегии CREATE.

Убедитесь, что привилегия находится в базе данных, которую вы пытаетесь использовать. Когда вы запускаете 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.

+0

Это то, что я думал, но эти привилегии уже предоставлены, и я по-прежнему отказываюсь от доступа. – jmilloy

+0

См. Правки выше; убедитесь, что вы выполняете команду против правильной базы данных. –

+0

Хммм Я попробовал 'CREATE AGGREGATE FUNCTION my_database.coverage ...', но получил синтаксическую ошибку. Это выделенный сервер, и я могу подтвердить, что я «использую» свою базу данных. Я не понимаю, почему он пытается создать его в базе данных mysql. – jmilloy