Установка разрешения на такие объекты, как хранимые процедуры, может быть выполнена с помощью «GRANT EXECUTE ON . to ;
Однако вы также можете захотеть предоставить права безопасности как на уровне входа, так и на уровне пользователя. Вы захотите определить и предоставить ТОЛЬКО необходимые права для объектов, к которым требуется доступ (например, выполнение). Рассмотрите возможность использования возможности «ВЫПОЛНИТЬ КАК», которая позволяет олицетворять другого пользователя для проверки разрешений, необходимых для выполнения кода, БЕЗ необходимости предоставлять все необходимые права всем базовым объектам (например, таблицам). EXECUTE AS можно добавить к хранимым процессам, функциям, триггерам и т. д.
Добавьте в код, как указано ниже, прямо в хранимой процедуре: CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER.
В этом случае вы выдаете себя за владельца вызываемого модуля. Вы также можете выдать себя за СЕБЯ, ИЛИ пользователя, создающего или изменяющего модуль, ИЛИ... выдать себя за CALLER, что позволит модулю получить разрешения текущего пользователя, ИЛИ... выдать себя за ВЛАДЕЛЬЦА, который получит разрешение владелец вызываемой процедуры ИЛИ... олицетворение 'user_name', которое будет олицетворять определенного пользователя ИЛИ... олицетворение 'login_name' с олицетворением определенного логина.
БОЛЬШУЮ часть времени вам нужно будет только предоставить права EXECUTE для хранимых процедур, а затем права будут предоставлены всем объектам, на которые есть ссылки в хранимой процедуре.
Таким образом, вам НЕ нужно давать неявные права (например, для обновления данных или вызова дополнительных процедур). Цепочка владения справится с этим за вас. Это особенно полезно для динамического SQL или если вам нужно создать задачи повышенной безопасности, такие как CREATE TABLE. EXECUTE AS — удобный инструмент для таких случаев.
Этот пример может помочь прояснить все это:
Создайте пользователя с именем NoPrivUser с публичным доступом к базе данных (например, dbadb)
USE [master] GO CREATE LOGIN [NoPrivUser] WITH PASSWORD=N'ABC5%', DEFAULT_DATABASE=[dbadb], CHECK_EXPIRATION=ON, CHECK_POLICY=ON GO USE [DBAdb] GO CREATE USER [NoPrivUser] ДЛЯ ВХОДА [NoPrivUser] GO
ПРИМЕЧАНИЕ: СОЗДАТЕЛЮ ИЛИ ВЛАДЕЛЕЦУ ЭТОЙ ПРОЦЕДУРЫ ТРЕБУЕТСЯ ПРАВА СОЗДАНИЯ ТАБЛИЦЫ в целевой базе данных.
используйте DBAdb go CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER AS IF НЕ СУЩЕСТВУЕТ (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].MyTable') AND введите (N'U')) CREATE TABLE MyTable (PKid int, column1 char(10)) INSERT INTO MyTable VALUES (1, 'ABCDEF')
GO
GRANT EXEC ON dbo.MyProcedure TO NoPrivUser; ИДТИ
-- Теперь войдите на сервер базы данных как NoPrivUser и выполните следующее.
использовать dbadb идти
EXEC dbo.MyProcedure
(затронуты 1 ряд)
Теперь попробуйте выбрать из новой таблицы, войдя в систему как NoPrivuser.
Вы получите следующее:
выберите * из MyTable перейти
Сообщение 229, уровень 14, состояние 5, строка 1. Отказано в разрешении SELECT для объекта «MyTable», базы данных «DBAdb», схемы «dbo».
Это ожидаемо, так как вы запускали процедуру только в контексте безопасности Owner при входе в систему как NoPrivUser. NoPrivUser, так как нет прав на фактическое чтение таблицы. Просто для выполнения процедуры, которая создает и вставляет строки.
С предложением EXECUTE AS хранимая процедура запускается в контексте владельца объекта. Этот код успешно создает dbo.MyTable, и строки успешно вставляются. В этом примере пользователь «NoPrivUser» не имеет абсолютно никаких прав на изменение таблицы, а также на чтение или изменение каких-либо данных в этой таблице. Он принимает только права, необходимые для выполнения этой конкретной задачи, закодированной ВНУТРИ контекста этой процедуры.
Этот метод создания хранимых процедур, которые могут выполнять задачи, требующие повышенных прав безопасности, без постоянного назначения этих прав, оказывается очень полезным.
person
Richard Ouimet
schedule
22.06.2012