Требуется ли определение при создании хранимой процедуры?

19

Я написал все процедуры MySQL как [email protected] :

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

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

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

    
задан Xorty 19.04.2010 в 11:02
источник

3 ответа

15

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

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

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

    
ответ дан maid450 19.04.2010 в 11:12
  • В нем говорится: «Предложение DEFINER определяет контекст безопасности, который будет использоваться при проверке прав доступа во время активации триггера. Более подробная информация приведена ниже в этом разделе». Поэтому, когда я уверен, процедуры используются только привилегированными пользователями, я могу полностью удалить целые вещи для определения? –  Xorty 19.04.2010 в 11:18
  • Да, я полагаю. Я думаю, что когда вы определяете права пользователя, существует привилегия «выполнение процедур», которая может быть предоставлена ​​/ отказана (нет уверенности в этом ...) –  maid450 19.04.2010 в 12:04
  • Это установит определитель в качестве текущего пользователя. Согласно MySQL doc Access Control для хранимых программ и представлений: «Все хранимые программы (процедуры, функции и триггеры) и представления могут иметь атрибут DEFINER, который именует учетную запись MySQL. Если атрибут DEFINER опущен из сохраненной программы или просмотра определение, учетная запись по умолчанию - это пользователь, который создает объект ». –  icc97 16.04.2012 в 11:16
  • Привет, атрибут DEFINER убивает меня ... дайте мне знать, как удалить это? Он автоматически создается, когда я создаю новую процедуру ... Я использую гостевой хостинг godaddy. –  Sensa 24.04.2012 в 10:59
  • Одинаковая проблема здесь, Definer - убийца. как я могу добавить процедуру без определителя? –  Gilad 29.04.2013 в 12:41
Показать остальные комментарии
1
CREATE DEFINER=[your_web_user]@% PROCEDURE p_add_user(...)

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

    
ответ дан Ghulam Dastagir - Yasir 03.05.2011 в 08:16
  • Возможно ли объяснить вам атрибут DEFINER? % означает - он позволяет любому пользователю с любого IP-адреса? Pls. Ответь мне. Я использую общий хостинг godaddy, в котором DEFINER автоматически создается, и мы не можем его удалить. его упоминается как DEFINER = [databasename] @%, но не позволяет мне передавать хранимую процедуру из приложения локальных окон; но я могу общаться, если я использую обычный запрос (например: select * from tablenm ...) Может ли кто-нибудь мне помочь в этом отношении - пожалуйста. –  Sensa 24.04.2012 в 14:35
0

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

SQL SECURITY INVOKER

Пример:

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

При этом применяются фактические привилегии вызывающего и часть DEFINER (даже если она автоматически добавляется при импорте схемы). Полное упоминание здесь: Ссылка

    
ответ дан MonkeyFeeder 23.08.2017 в 10:36