Spec-Zone .ru
спецификации, руководства, описания, API

19.6. Управление доступом для Сохраненных Программ и Представления

Сохраненные программы и представления определяются до использования и, когда ссылающийся, выполняются в пределах контекста защиты, который определяет их полномочия. Этими полномочиями управляет их DEFINER атрибут, и, если есть один, их SQL SECURITY характеристика.

У всех сохраненных программ (процедуры, функции, триггеры, и события) и представления может быть a DEFINER атрибут, который называет учетную запись MySQL. Если DEFINER атрибут опускается из сохраненной программы или определения представления, учетная запись значения по умолчанию является пользователем, который создает объект.

Кроме того, у сохраненных подпрограмм (процедуры и функции) и представления может быть a SQL SECURITY характеристика со значением DEFINER или INVOKER определить, выполняется ли объект в устройстве определения или invoker контексте. Если SQL SECURITY характеристика опускается, значение по умолчанию является контекстом устройства определения.

Триггеры и события имеют нет SQL SECURITY характеристика и всегда выполняется в контексте устройства определения. Сервер вызывает эти объекты автоматически по мере необходимости, таким образом нет никакого пользователя вызова.

Устройство определения и invoker контексты защиты отличаются следующим образом:

Рассмотрите следующую хранимую процедуру:

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

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

Теперь рассмотрите эту хранимую процедуру, которая идентична p1 за исключением того, что SQL SECURITY характеристика INVOKER:

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

p2, в отличие от этого p1, выполняется в INVOKER контекст защиты. DEFINER атрибут не важен и p2 выполняется с полномочиями пользователя вызова. p2 сбои, если invoker недостает EXECUTE полномочие для p2 или UPDATE полномочие для таблицы t1.

MySQL использует следующие правила управлять, какие учетные записи пользователь может определить в объекте DEFINER атрибут:

Чтобы минимизировать потенциал риска для сохраненной программы и создания представления и использовать, следуйте за этими направляющими линиями: