Привилегии хранимых процедур
Важно внимательно рассмотреть привилегии, связанные с хранимыми функциями и хранимыми процедурами. Следующее — объяснение их работы.
Создание хранимых процедур
- Для создания хранимой процедуры требуется привилегия
CREATE ROUTINE. ПривилегияSUPERнеобходима, если объявленDEFINER, который не является учётной записью создателя (см. оператор DEFINER ниже). ПривилегияSUPERтакже необходима, если используется двоичное протоколирование на основе инструкций. Подробнее см. Двоичное протоколирование хранимых процедур.
Изменение хранимых процедур
- Для внесения изменений в хранимую процедуру или её удаления необходима привилегия
ALTER ROUTINE. Создатель процедуры временно получает эту привилегию, если пытается изменить или удалить созданную им процедуру, если переменная automatic_sp_privileges не установлена в0(по умолчанию она равна 1). - Привилегия
SUPERтакже необходима, если используется двоичное протоколирование на основе инструкций. Подробнее см. Двоичное протоколирование хранимых процедур.
Выполнение хранимых процедур
- Для выполнения хранимой процедуры требуется привилегия
EXECUTE. Эта привилегия также временно предоставляется создателю, если он пытается выполнить свою процедуру, если переменная automatic_sp_privileges не установлена в0. SQL SECURITY clause(по умолчаниюDEFINER) определяет, какие привилегии используются при вызове процедуры. ЕслиSQL SECURITYравноINVOKER, тело функции будет оцениваться с привилегиями пользователя, вызвавшего функцию. ЕслиSQL SECURITYравноDEFINER, тело функции всегда оценивается с привилегиями учётной записи создателя.DEFINER— значение по умолчанию. Таким образом, по умолчанию пользователи, имеющие доступ к базе данных, связанной с хранимой процедурой, также могут выполнить эту процедуру и потенциально выполнить операции, на которые у них обычно нет разрешений.- Создателем процедуры является учётная запись, которая выполнила инструкцию
CREATE FUNCTIONилиCREATE PROCEDURE, независимо от того, указан лиDEFINER. По умолчанию создатель — это создатель, если не указано иное. - Сервер автоматически изменяет привилегии в таблице mysql.proc по мере необходимости, но не будет проверять ручные изменения.
Оператор DEFINER
Если он опущен, DEFINER рассматривается как учётная запись, которая создала хранимую процедуру или представление. Если учётная запись, создающая процедуру, имеет привилегию SUPER, может быть указана другая учётная запись в качестве DEFINER.
Оператор SQL SECURITY
Этот оператор определяет контекст, в котором будет выполняться хранимая процедура или представление. Он может принимать два значения — DEFINER или INVOKER. DEFINER — это учётная запись, указанная как DEFINER, когда была создана хранимая процедура или представление (см. предыдущий раздел). INVOKER — это учётная запись, вызывающая процедуру или представление.
Например, предположим, что процедура, созданная суперпользователем, указанным как DEFINER, удаляет все записи из таблицы. Если SQL SECURITY=DEFINER, любой, кто выполняет процедуру, независимо от того, имеет ли он привилегии удаления, сможет удалить записи. Если SQL SECURITY = INVOKER, процедура удалит записи только в том случае, если у учётной записи, вызывающей процедуру, есть разрешение на это.
INVOKER обычно менее рискованно, так как пользователь не может выполнить операции, на которые он обычно не имеет права. Однако нередко учётные записи имеют относительно ограниченные разрешения, но им специально предоставляется доступ к процедурам, которые затем вызываются в контексте DEFINER.
Удаление хранимых процедур
Все привилегии, относящиеся к хранимой процедуре, будут удалены при выполнении DROP FUNCTION или DROP ROUTINE. Однако если используется CREATE OR REPLACE FUNCTION или CREATE OR REPLACE PROCEDURE для удаления и замены процедуры, любые привилегии, относящиеся к этой процедуре, не будут удалены.
См. также
- Изменение DEFINER хранимых процедур MySQL и т. д. - запись на сайте maria.com о том, что нужно сделать после удаления пользователя и необходимости изменения DEFINER для всех баз данных, которые в настоящее время настроены на этого удаленного пользователя.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/stored-routine-privileges/