Установка разрешения на объекты, такие как хранимые процедуры могут быть выполнены с «GRANT EXECUTE ON к;..
Однако, вы также можете предоставить обеспечительные права как на входе в систему и пользовательского уровня Вы хотите, чтобы определить и предоставить ТОЛЬКО необходимые права для объектов, которым требуется доступ (например, выполнение). Рассмотрим использование возможности «EXECUTE AS», которая позволяет олицетворить другого пользователя для проверки разрешений, необходимых для выполнения кода БЕЗ предоставления всех необходимых права на все базовые объекты (например, таблицы). EXECUTE AS может быть добавлен к сохраненным процессам, функциям, триггерам и т. д.
Добавить в корзину он закодирует следующим образом в рамках хранимой процедуры: СОЗДАТЬ ПРОЦЕДУРУ dbo.MyProcedure WITH EXECUTE AS OWNER
В этом случае вы выдаете себя за владельца вызываемого модуля. Вы также можете олицетворять SELF, или пользователь, создающий или изменяющий модуль OR ... imperonate CALLER, который позволит модулю принимать разрешения текущего пользователя, ИЛИ ... олицетворять OWNER, который возьмет на себя разрешение владелец процедуры, называемой OR ...олицетворять «имя_пользователя», которое выдаст себя за конкретного пользователя ИЛИ ... выдаст «имя_пользователя», выдаст себя за конкретный логин.
В самое короткое время вам необходимо предоставить права EXECUTE сохраненным процессам, а затем права предоставляются всем объектам, на которые ссылаются хранимые процедуры.
Таким образом, вам НЕ нужно давать неявные права (например: для обновления данных или для вызова дополнительных процедур). Собственная цепочка обрабатывает это для вас. Это особенно полезно для динамического sql или если вам нужно создать повышенные задачи безопасности, такие как CREATE TABLE. EXECUTE AS - удобный инструмент для рассмотрения.
Этот пример может помочь прояснить все это:
Создание пользователя с именем NoPrivUser с открытым доступом к базе данных (например, dbadb)
USE [мастер] GO CREATE LOGIN [NoPrivUser] С PASSWORD = N 'ABC5%', DEFAULT_DATABASE = [dbadb], CHECK_EXPIRATION = ВКЛ, CHECK_POLICY = О ГО ИСПОЛЬЗОВАНИЯ [dBAdb] GO CREATE USER [NoPrivUser] для входа в систему [NoPrivUser] GO
ПРИМЕЧАНИЕ: CREATOR или владелец этой процедуры ПОТРЕБУЕТ CREATE ТАБЛИЧНЫЕ ПРАВА в целевой базе данных.
использование DBAdb перейти CREATE ПРОЦЕДУРА dbo.MyProcedure С EXECUTE AS OWNER КАК ЕСЛИ НЕ СУЩЕСТВУЕТ (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID (N '[DBO] .MyTable') и введите (N'U ')) CREATE TABLE MyTable (PKid INT, столбец1 символ (10)) INSERT INTO MyTable VALUES (1, 'ABCDEF')
GO
GRANT EXEC ON dbo.MyProcedure TO NoPrivUser; GO
- Теперь войдите в свой сервер базы данных как NoPrivUser и выполните следующее.
использование dbadb идти
EXEC dbo.MyProcedure
(1 строка (ы) пострадавших)
Теперь попробуйте выбрать из новой таблицы при входе в систему как NoPrivuser.
вы получите следующее:
выберите * из MyTable перейти
Msg 229, Level 14, State 5, строка 1 ВЫБРАТЬ разрешение было отказано на объекте 'MyTable', базы данных 'DBAdb' , схема 'dbo'.
Ожидается, так как вы только запускали процедуру в контексте безопасности Владельца, когда вы вошли в систему как NoPrivUser. NoPrivUser как никакие права фактически читать таблицу. Просто выполните процедуру, которая создает и вставляет строки.
С условием EXECUTE AS хранимая процедура запускается в контексте владельца объекта. Этот код успешно создает dbo.MyTable, и строки успешно вставлены. В этом примере пользователь «NoPrivUser» не имеет абсолютных прав на изменение таблицы или чтения или изменения каких-либо данных в этой таблице. Он принимает только права, необходимые для выполнения этой конкретной задачи, закодированной в контексте этой процедуры.
Этот метод создания хранимых процедур, который может выполнять задачи, требующие повышенных обеспечительных прав без постоянного назначения этих прав, очень полезен.
Проголосовал закрыть, как принадлежит на ServerFault. com –