Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день.
Наткнулся на одну неприятную вещь, возможно я что то делаю не так...
Создал в базе процедуру, далее для удобства написания и т.д. использовал Mysql WorkBench, под рутом все расчудесно работает.
Когда все дописал, решил обрезать root доступ только от localhost а для базы и процедуры (внешие подключения) создал юзера.
Новый юзер может подключаться с localhost и некоторых внешних IP только к моей базе.
Для процедур дал этому юзеру права:
grant all on procedure routine.res to user;
В создании процедуры добавил права на этого пользователя:
REATE DEFINER=`user`@`%` PROCEDURE .....
Вроде все работает, но возникла необходимость изменить процедуру, решил это сделать под новым юзером (user).
Подключился к базе с правами нового пользователя через Mysql WorkBench но получить текст процедуры не могу и как следствие изменить ее. Таблицы читаются и процедура, от имени это пользователя работает.
Под root все работает, но так как REATE DEFINER=`user`@`%` PROCEDURE ..... не могу запустить процедуру для отладки результата.
Какждый раз, для того то б изменить что-то переключаться на root как-то проблематично.
Подскажите пожалуйста выход из ситуации или укажите на мою ошибку ... что я делаю не так ?
Может даже это фича такая у WorkBench ...
Заранее спасибо.
Неактивен
А права на пользователя покажите? Проще всего подключиться под ним
и выполнить SHOW GRANTS;
Неактивен
Ответило вот так:
GRANT USAGE ON *.* TO 'user'@'localhost' IDENTIFIED BY PASSWORD '*dsfsfsfsfw3432r3fwe4542wef2r4fe' | | GRANT ALL PRIVILEGES ON `base`.* TO 'user'@'localhost'
Как я понимаю этого не достаточно ...
Как правильно исправить ситуацию ?
Неактивен
Вроде разобрался.
Залез в таблицу mysql.proc и изменил поле definer нужных процедур с user@% на user@IP, т.е. указал конкретный IP адрес и после этого заработало нормально.
Вот теперь более конкретный вопрос.
Символ % уже не рулит ?
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 16 Server version: 5.5.11 Source distribution
Я так понимаю что если теперь указывать REATE DEFINER=`user`@`IP_адрес` PROCEDURE ..... то все будет работать, но что делать если юзеру нужно дать доступ от нескольких внешних IP адресов ?
На данный момент от пользователя SHOW GRANTS; такие же как и до внесенных изменений.
Неактивен
Вы подключились под другим пользователем (с localhost), а надо было подключиться
под тем пользователем, с которым проблемы.
user@localhost, user@ip и user@'%' — это три разных пользователя.
Неактивен
paulus написал:
Вы подключились под другим пользователем (с localhost), а надо было подключиться
под тем пользователем, с которым проблемы.
user@localhost, user@ip и user@'%' — это три разных пользователя.
На сколько я понимаю символ % говорит что от любого IP или доменного имени.
Права юзеру на базу давал так:
grant all on base.* to user@'%' identified by 'password';
Подключался для проверки grant так:
localhost> mysql -u user -p
Что сделал не верно ?
Неактивен
Подключились по unix socket под пользователем user@localhost
(который ≠ user@'%').
Неактивен
paulus написал:
Подключились по unix socket под пользователем user@localhost
(который ≠ user@'%').
Да действительно под socket ходил ....
Странно конечно, но ...
Удалил все права пользователя, прересоздал права заново - все заработало и доступ и изменение процедур.
Но права пришлось давать такие
GRANT ALL ON base.* TO 'user'@'%' IDENTIFIED BY 'password';
После % пришлось добавить и для localhost, а то по сетке пускало а локально - нет.
GRANT ALL ON base.* TO 'user'@'localhost' IDENTIFIED BY 'password';
Спасибо за помощь.
Неактивен
Уважаемый paulus, все же мне немного не понятно как дать полный доступ к процедуре если редактирование, изменение процедуры планируется вести с нескольких внешних IP адресов. Доступ c любого IP для пользователя не хотелось бы давать.
Права на базу можно дать так:
GRANT ALL ON base.* TO 'user'@'IP1' IDENTIFIED BY 'password'; GRANT ALL ON base.* TO 'user'@'IP2' IDENTIFIED BY 'password';
А как это сделать для процедуры ?
Ведь тут:
REATE DEFINER=`user`@`%` PROCEDURE
на сколько я понимаю, можно указать только один доступ...
делать =`user`@`%` не хотелось бы.
Хотел бы сделать как то так =`user`@`IP1` и =`user`@`IP2`.
Неактивен
DEFINER процедуры используется для определения прав работы самой процедуры.
Допустим, у Вас есть сверхсекретная табличка, к которой Вы не хотите давать
доступ пользователям. Вы можете сделать процедуру, которая будет работать с
этой табличкой так, как Вам нужно, и создателем этой процедуры должен быть
человек, который может эту табличку читать.
Пример:
1. Есть табличка A, на которую есть права только у пользователя root@localhost.
2. root@localhost создает хранимую процедуру P, которая позволяет читать неко-
торые строки из таблички A.
3. root@localhost дает право пользователю user@localhost запускать P.
4. В результате, user@localhost не может ничего сделать с таблицей A, но зато
может вызвать P и через нее получить доступ к некоторым строкам этой таблицы.
Это я всё к тому, что DEFINER определяет права внутри процедуры, а права запуска
процедуры определяются снаружи, такими же GRANTами, которые Вы написали.
Неактивен