MySQL: как я могу позволить пользователю B изменять процедуру пользователя A, не предоставляя ему разрешение GLOBAL SELECT? - PullRequest
0 голосов
/ 26 октября 2018

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

Проблема в том, что пользователь B хочет иметь возможность редактировать процедуру (у него нет доступа к исходному источнику), но он не может. В 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

Это не возвращает исходный код, как если бы это выполнял пользователь A, вместо этого он возвращает 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

1 Ответ

0 голосов
/ 26 октября 2018

Документы MySQL 8.0 изменены так, как это выглядит, и содержат ошибку.

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

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

source 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...