Этот вопрос немного длинен, но благодаря недавнему редактированию он вернулся в начало очереди:
В процедурах есть три «роли», под которыми может быть обеспечена безопасность.назначено (на самом деле 4, но я доберусь до этого)
OWNER - это база данных / пользователь, под которой создается процедура.Если вы используете для процедуры настройки SQL SECURITY по умолчанию, то OWNER
должен иметь доступ к объектам, используемым в процедуре WITH GRANT OPTION
.Итак: GRANT SELECT ON corp_invoice_VIEWS TO <whatever database this proc is in> WITH GRANT OPTION
вам нужно будет предоставить этот доступ для каждой базы данных / представления / таблицы, которые выбраны здесь в предложении FROM
.
СОЗДАТЕЛЬ - Это вы, поскольку вы составляете процедуру.При использовании настроек SQL SECURITY по умолчанию для процедуры вам потребуется доступ к объектам, используемым в процедуре.Вы должны иметь такой доступ уже для того, чтобы запустить SELECT самостоятельно.Так что это все хорошо.
INVOKER - это пользователь, который выполнит / вызовет процедуру.С настройками SQL SECURITY по умолчанию для процедуры INVOKER
просто необходимо иметь EXECUTE
процедуру для процедуры.
Параметры SQL SECURITY по умолчанию для процедуры (которые могут быть переопределены при написании процедуры) - SQL SECURITY DEFINER
.Это «четвертая» роль, о которой я упоминал выше.Определитель безопасности проверяет, что и CREATOR
, и OWNER
процедуры имеют доступ к объектам в процедуре при компиляции процедуры.Более того, при выполнении процедуры OWNER
привилегии проверяются еще раз.Выдает ошибку во время компиляции, если вы и база данных, в которой находится эта процедура, не имеют доступа.Он выдаст ошибку во время выполнения, если OWNER
(база данных, в которой находится процедура) также не имеет доступа.
Ваши варианты решения этой ошибки:
Предоставьте владельцу процедуры SELECT доступ к таблицам, представлениям или базам данных, содержащим эти таблицы / представления, с параметром GRANT, чтобы выполнялось значение по умолчанию для ОПРЕДЕЛИТЕЛЯ БЕЗОПАСНОСТИ SQL.Это более безопасный и менее изменчивый маршрут.
Измените sql security для процедуры на SQL SECURITY CREATOR, чтобы при компиляции проверялись только ваши учетные данные (создатель процедуры).выполнение.Это дешевое исправление, но оно понятно, если вам не хватает разрешений для изменения защиты базы данных, в которой вы работаете.
Измените защиту SQL в процедуре на SQL SECURITY INVOKER, чтобы тольколицо, выполняющее процедуру после ее компиляции, используется для проверки привилегий.Это означает, что выполняемый пользователь должен не только иметь доступ к процедуре EXECUTE PROCEDURE, но и иметь доступ SELECT к представлениям / таблицам, используемым внутри.Это, вероятно, более безопасный вариант, чем номер 2, но менее надежный, чем вариант 1 (где проверяются создатель и владелец).
Подробнее о процедуре обеспечения безопасности можно прочитать на сайте документации .