Итак, первоначальная проблема заключалась в том, что в MySQL Workbench я попытался изменить процедуру и ничего не получил. Нет ошибки, просто ничего не произошло. Оказывается, несмотря на то, что у меня есть полные права доступа к схеме, поскольку я не определяю хранимую процедуру, я не могу просматривать ее исходный код.
Сценарий:
Database: Bugs
Users: A, B
Permissions:
grant all privileges on bugs.* to 'A'@'%'
grant all privileges on bugs.* to 'B'@'%'
Пользователь A создает хранимую процедуру
create procedure user_A_procedure ...
Теперь у нас есть процедура user_A_prodecure
, для которой definer
установлено значение A@%
, а security_type
установлено значение DEFINER
.
mysql> SHOW PROCEDURE STATUS\G
Db: bugs
Name: user_A_prodecure
Type: PROCEDURE
Definer: A@%
Modified: 2018-10-26 10:30:06
Created: 2018-10-26 10:30:06
Security_type: DEFINER
Comment:
character_set_client: utf8 collation_connection: utf8_general_ci Сопоставление базы данных: utf8_general_ci
Проблема в том, что пользователь Б хочет иметь возможность редактировать процедуру (у него нет доступа к исходному коду), но не может. В MySQL Workbench ничего не происходит, когда они пытаются изменить процедуру, в командной строке они не видят исходный код
mysql> SHOW CREATE PROCEDURE user_A_procedure
Procedure: user_A_procedure
sql_mode:
Create Procedure: NULL
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
Это не возвращает исходный код, как если бы его выполнял пользователь А, вместо этого он возвращает NULL.
Оказывается, чтобы использовать MySQL Workbench или SHOW CREATE PROCEDURE для просмотра хранимой процедуры другого определителя, пользователю необходимо предоставить разрешение GLOBAL SELECT [1].
GLOBAL SELECT дает пользователю возможность прочитать все в каждой базе данных и НЕ является желательным вариантом.
Итак, мой вопрос: как я могу разрешить пользователю A видеть/изменять процедуру пользователя B, не давая им разрешения GLOBAL SELECT?
Использованная литература: