Ограничить пользователя хранимыми процедурами
Мне нужно ограничить доступ пользователей к SELECT, INSERT, UPDATE и DELETE, чтобы пользователь мог управлять данными только с помощью хранимых процедур, которые я предоставляю.
Так, например
SELECT * FROM Table1
должен вернуться
The SELECT permission was denied on the object 'Table1'
однако, если есть хранимая процедура SelectTable1, определенная как
CREATE PROCEDURE SelectTable1
AS
BEGIN
SELECT * FROM Table1
END
(реальная содержит фильтрацию и параметры, поэтому она не лишена смысла, как приведенная выше)
пользователь должен выполнить его успешно и получить набор результатов.
Но, очевидно, у меня нет успеха в реализации этого набора разрешений. Кто-нибудь может указать мне на какой-то конкретный учебник? MSDN был не очень полезным.
База данных - SQL Server 2012, и все объекты (таблицы и хранимые процедуры) находятся в пользовательской схеме.
2 ответа
Вы можете сделать это с помощью GRANT EXEC либо на определенных процедурах, либо на схемах, либо в базе данных.
В следующем примере предоставляется разрешение EXECUTE для хранимой процедуры HumanResources.uspUpdateEmployeeHireInfo роли приложения с именем Recruiting11.
USE AdventureWorks2012;
GRANT EXECUTE ON OBJECT::HumanResources.uspUpdateEmployeeHireInfo
TO Recruiting11;
GO
Благодаря Igor Borisenko я попал на нужную страницу MSDN и перешел по ссылкам на права.
Однако использование предложенных цепочек владения было слишком сложным для меня, поэтому я использовал
WITH EXECUTE AS OWNER
на моих хранимых процедурах, и это работает очень хорошо. Когда я вхожу в систему с ограниченными правами, я вижу только процедуры, никаких таблиц вообще, и я могу выполнять процедуры, но даже не выбирать из таблиц.
Также хочу отметить, что эта концепция очень похожа на setuid и поэтому была мне знакома.
Я отмечаю ответ Igors как ответ, потому что цепочки владения кажутся более общими, просто хотел поделиться информацией, которую нашел.