Требуется ли «определитель» при создании хранимой процедуры? - PullRequest
25 голосов
/ 19 апреля 2010

Я написал все процедуры MySQL как root@localhost:

CREATE DEFINER=`root`@`localhost` PROCEDURE `p_add_user`(...)

Проблема в том, что при развертывании на другом сервере я должен заменить root на текущего пользователя и заменить localhost на текущий IP, что раздражает.

Есть ли способ написать процедуры, чтобы кому-то, кто хочет использовать мою базу данных и процедуры, не пришлось бы изменять определение каждой процедуры?

Ответы [ 3 ]

19 голосов
/ 19 апреля 2010

Как указано в документации MySQL здесь

CREATE
[DEFINER = { user | CURRENT_USER }]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body

Итак, часть DEFINER не обязательна, просто CREATE PROCEDURE должна работать.

2 голосов
/ 23 августа 2017

Вы можете указать привилегии выполнения, добавив следующий оператор в тело процедуры (после объявления):

SQL SECURITY INVOKER

Пример:

CREATE DEFINER=`root`@`localhost` PROCEDURE `p_add_user`()
SQL SECURITY INVOKER
(...)

При этом применяются действительные привилегии invoker, а часть DEFINER пропускается (даже если она добавляется автоматически при импорте схемы). Полная ссылка здесь: https://dev.mysql.com/doc/refman/5.7/en/stored-programs-security.html

1 голос
/ 03 мая 2011
CREATE DEFINER=[your_web_user]@% PROCEDURE p_add_user(...)

Проверьте это .. возможно, это поможет вам, если вы хотите определить пользователя в вашей процедуре ...

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