При создании хранимой процедуры требуется `definer`?
Я написал все процедуры MySQL как [email protected]
:
CREATE DEFINER=`root`@`localhost` PROCEDURE `p_add_user`(...)
Проблема при развертывании на другой сервер, я должен заменить root
на текущего пользователя и заменить localhost
на текущий IP, что раздражает.
Есть ли способ написать процедуры, чтобы кто-то, кто хочет использовать мою базу данных и процедуры, не должен был изменять определитель каждой процедуры?
Ответы
Ответ 1
Как указано в документации MySQL здесь
CREATE
[DEFINER = { user | CURRENT_USER }]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
Итак, часть DEFINER не является обязательной, просто должна работать CREATE PROCEDURE.
Ответ 2
CREATE DEFINER=[your_web_user]@% PROCEDURE p_add_user(...)
Проверьте это.. возможно, это поможет вам, если вы хотите определить пользователя в своей процедуре...
Ответ 3
Вы можете указать права выполнения, добавив следующий оператор в тело процедуры (после объявления):
SQL SECURITY INVOKER
Пример:
CREATE DEFINER=`root`@`localhost` PROCEDURE `p_add_user`()
SQL SECURITY INVOKER
(...)
Таким образом, применяются фактические привилегии вызывающего и часть DEFINER
опущена (даже если она автоматически добавляется при импорте схемы).
Полное упоминание здесь:
https://dev.mysql.com/doc/refman/5.7/en/stored-programs-security.html