Question

I'm dipping my toe into using stored functions with MySQL and am having trouble.

Having created a function and tested it, I don't seem to be able to allow other users to execute it. From the documentation, it seems that I need to grant EXECUTE access to the other users, but that doesn't appear to be sufficient.

I've put together a couple of scripts that I believe demonstrate the problem:

# 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';

and

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

When I run execute the second script, I get an error:

$ 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'

I have no doubt that I'm missing something obvious, but I can't see what that is. I imagine that I've got something wrong in the GRANT EXECUTE... statement in the first script, and am deeply suspicious of my use of single quotes, but I recall trying most of the combinations of placement and inclusion of single quotes without success.

I'd be really grateful to anyone who can point out my error.

For reference, I'm running Server version: 5.1.67-0ubuntu0.10.04.1 (Ubuntu) (on Ubuntu!).

Thanks

Was it helpful?

Solution

test2.foo is a function not a procedure.

Try:

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

(I was able to reproduce the problem locally and confirm that this change works.)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top