Ограничить пользователя хранимыми процедурами

Мне нужно ограничить доступ пользователей к 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 как ответ, потому что цепочки владения кажутся более общими, просто хотел поделиться информацией, которую нашел.

Другие вопросы по тегам