2013-04-20 2 views
4

Я окунаюсь в использование хранимых функций с MySQL и у меня проблемы.Не удается выполнить хранимую процедуру MySQL

Создав функцию и протестировав ее, я, похоже, не могу разрешить другим пользователям ее выполнять. Из документации кажется, что мне нужно предоставить EXECUTE доступ другим пользователям, но этого недостаточно.

Я соединил несколько сценариев, которые я считаю продемонстрировать проблему:

# This script creates two databases with a stored function in each. 
# 
# On one database, tester in granted all privileges. 
# On the other, tester only gets a few. 
# 
# We want to find the minimum privileges required to allow tester to execute the 
# stored function. 
# 
# This script must be run by an administrative user, i.e. root 

CREATE DATABASE test1; 

DELIMITER $$ 
CREATE FUNCTION test1.foo() RETURNS VARCHAR(255) DETERMINISTIC 
BEGIN 
    RETURN ('garp'); 
END$$ 

DELIMITER ; 
GRANT ALL PRIVILEGES ON test1.* TO 'tester'@'localhost'; 

# 

CREATE DATABASE test2; 
DELIMITER $$ 
CREATE FUNCTION test2.foo() RETURNS VARCHAR(255) DETERMINISTIC 
BEGIN 
    RETURN ('garp'); 
END$$ 

DELIMITER ; 

GRANT EXECUTE ON PROCEDURE test2.foo TO 'tester'@'localhost'; 

и

# This script tests whether tester can access the stored functions 
# 
# It should be executed by tester 

SELECT 'test1.foo(): ', test1.foo(); 
SELECT 'test2.foo(): ', test2.foo(); 

Когда я бегу выполнить второй сценарий, я получаю сообщение об ошибке:

$ mysql --user=tester --password=tester --skip-column-names < testScript2.sql 
test1.foo(): garp 
ERROR 1370 (42000) at line 6: execute command denied to user 'tester'@'localhost' for routine 'test2.foo' 

У меня нет сомнений в том, что мне не хватает чего-то очевидного, но я не вижу, что это такое. Я предполагаю, что у меня что-то не так в операторе GRANT EXECUTE... в первом скрипте, и я глубоко подозрительно отношусь к использованию одиночных кавычек, но я помню, что большинство комбинаций размещения и включения одинарных кавычек я не использовал.

Я был бы очень благодарен всем, кто может указать мою ошибку.

Для справки, я бегу Server version: 5.1.67-0ubuntu0.10.04.1 (Ubuntu) (на Ubuntu!).

Thanks

ответ

4

test2.foo - это функция не процедура.

Try:

GRANT EXECUTE ON FUNCTION test2.foo TO 'tester'@'localhost'; 

(я был в состоянии воспроизвести проблему на местном уровне и подтвердить, что это изменение работы.)

+0

Благодаря Шон. Я знал, что пропустил что-то ослепительно очевидное :-). – nurdglaw