MySQL: как я могу разрешить пользователю B изменять процедуру пользователя A, не давая им разрешения GLOBAL SELECT?

Итак, первоначальная проблема заключалась в том, что в 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?

Использованная литература:

  1. https://dev.mysql.com/doc/refman/8.0/en/show-create-procedure.html
  2. https://dev.mysql.com/doc/refman/8.0/en/stored-programs-security.html

person Austin France    schedule 26.10.2018    source источник
comment
глобальное разрешение на выбор? Вы уверены, что пользователю нужно не только разрешение на выбор в mysql.proc? Потому что в основном я предполагаю, что оператор читает только из mysql.proc.   -  person Raymond Nijland    schedule 26.10.2018
comment
это работает, спасибо. Вы хотите добавить это в качестве ответа?   -  person Austin France    schedule 26.10.2018
comment
Готово, я заметил, что в документах MySQL 5.7 с самого начала был правильный ответ. Иногда кажется полезным изменить версии MySQL в документах MySQL.   -  person Raymond Nijland    schedule 26.10.2018
comment
Да, и спасибо. Именно тому утверждению, которое вы выделили, я следовал.   -  person Austin France    schedule 26.10.2018
comment
Таблица mysql.proc больше не существует в mysql. Я проверил в mysql 8.0. Не удалось найти способ предоставить разрешение на изменение SP пользователю, который не является определяющим. Мне пришлось дать привилегию Global Select.   -  person Himalaya Garg    schedule 02.06.2021


Ответы (1)


Документы MySQL 8.0 изменены и содержат ошибку.

Этот оператор является расширением MySQL. Он возвращает точную строку, которую можно использовать для повторного создания именованной хранимой процедуры. Аналогичный оператор SHOW CREATE FUNCTION отображает информацию о сохраненных функциях (см. Раздел 13.7.6.8, «Синтаксис SHOW CREATE FUNCTION»).

Чтобы использовать любой оператор, у вас должна быть глобальная привилегия SELECT.

источник https://dev.mysql.com/doc/refman/8.0/en/show-create-procedure.html

по сравнению с документами MySQL 5.7.

Этот оператор является расширением MySQL. Он возвращает точную строку, которую можно использовать для повторного создания именованной хранимой процедуры. Аналогичный оператор SHOW CREATE FUNCTION отображает информацию о хранимых функциях (см. Раздел 13.7.5.8, «Синтаксис SHOW CREATE FUNCTION»).

Чтобы использовать любой оператор, вы должны быть пользователем, указанным в предложении DEFINER подпрограммы, или иметь доступ SELECT к таблице mysql.proc. Если у вас нет привилегий для подпрограммы само по себе, значение, отображаемое для поля «Создать процедуру» или «Создать функцию», будет NULL.

источник https://dev.mysql.com/doc/refman/5.7/en/show-create-procedure.html

person Raymond Nijland    schedule 26.10.2018
comment
Вот как это работает в mysql 8.0. Таблица «mysql.proc» больше не существует в MySQL, поэтому пришлось предоставить привилегию Global Select пользователю, который не является определяющим, для изменения процедуры. - person Himalaya Garg; 02.06.2021