В MySQL вам это сделать не удастся. Без гранта на SELECT, CALL не выполняется. Вообще там привилегии через жопу сделаны. Пример. Делаем 1 таблицу и одну процедуру с селектом из этой таблицы. Юзеру даем грант ТОЛЬКО на выполнение процедуры. Результат: процедура не выполняется, т.к. нет гранта на SELECT внутри процедуры. Полный бред…
mysql> create database t;
Query OK, 1 row affected (0.00 sec)
mysql> use t
Database changed
mysql> CREATE TABLE `testtable` (
-> `id` int(11) NOT NULL,
-> `name` varchar(255) NOT NULL
-> ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Query OK, 0 rows affected (0.06 sec)
mysql> DELIMITER $$
mysql> CREATE
-> PROCEDURE testproc ()
-> SQL SECURITY INVOKER
-> BEGIN
-> SELECT * FROM testtable;
-> END$$
Query OK, 0 rows affected (0.00 sec)
mysql> grant usage on t.* to testuser@localhost identified by 'qwe';
Query OK, 0 rows affected (0.01 sec)
mysql> grant execute on procedure t.testproc to testuser@localhost;
Query OK, 0 rows affected (0.01 sec)
mysql> exit
Bye
# mysql -u testuser -p
mysql> use t
Database changed
mysql> select * from testtable;
ERROR 1142 (42000): SELECT command denied to user 'testuser'@'localhost' for table 'testtable'
mysql> call testproc();
ERROR 1142 (42000): SELECT command denied to user 'testuser'@'localhost' for table 'testtable'