5

На что влияет адрес хоста у создателя подпрограммы в MySQL? Например, при создании подпрограммы (хранимой процедуры, функции, триггера и т.д.) определяется создатель подпрограммы (DEFINER):

CREATE DEFINER = 'admin'@'localhost' PROCEDURE p1()
SQL SECURITY DEFINER
BEGIN
  UPDATE t1 SET counter = counter + 1;
END;

На что тогда влияет адрес? Например, что бы изменилось, если бы вместо 'admin'@'localhost' тут было 'admin'@'%'?

Ksenia
  • 10,679

1 Answers1

2

DEFINER просто говорит базе, какой контекст безопасности использовать при выполнении процедуры. Если он стоит как DEFINER - привилегии берутся для аккаунта, который создал процедуру, а если стоит INVOKER - то тогда привилегии, как у того, кто вызвал.

CREATE DEFINER = 'admin'@'localhost' PROCEDURE p1()
SQL SECURITY DEFINER
BEGIN
  UPDATE t1 SET counter = counter + 1;
END;

Любой пользователь, который имеет привилегию EXECUTE на над процедурой p1 может вызвать ее с помощью оператора CALL. Однако, когда p1 выполняется, она делает это в контексте безопасности DEFINER и, следовательно, выполняется с привилегиями 'admin'@'localhost' , учетной записи, указанной в атрибуте DEFINER. Эта учетная запись должна иметь привилегию EXECUTE для p1 , а также UPDATE привилегии для таблицы t1 . В противном случае, процедура не выполняется из-за отсутствия достаточных привилегий.

Адрес говорит вам о том, что будут использованы привелегии определенные для пользователя 'admin'@'localhost. Тоесть пользователя admin который подключается с localhost, в MYSQL разграничение доступа осуществляется по имени пользователя и адресу с которого идет подключение, для пользователя admin с localhost можно установить GRANT ALL а для других хостов только SELECT например.

Пользователи 'admin'@'localhost' и 'admin'@'%' - это совершенно разные аккаунты.

Firepro
  • 9,352
  • Но ведь, насколько я понимаю, % - это любой хост. Разве localhost не входит в это множество? – Ksenia Sep 09 '16 at 09:57
  • @Ksenia Конечно входит, но если есть 2 аккаунта, и вы хотите выполнить подключение с localhost, то для вас будет использована запись 'admin'@'localhost', а не 'admin'@'%', а если будете выполнять подключение с другого хоста, то конечно будет использована 'admin'@'%'. Приоритет определяется наличием записи для хоста с которого выполняется подключение, в противном случае берется запись куда этот хост может входить, как в случае с %. – Firepro Sep 09 '16 at 10:00