4

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 ();

2 番目のスクリプトを実行すると、エラーが発生します。

$ 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で!)実行しています。

ありがとう

4

1 に答える 1