将用户限制为存储过程

时间:2013-09-16 07:04:31

标签: sql sql-server sql-server-2012 database-schema database-permissions

我需要限制用户对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 个答案:

答案 0 :(得分:3)

您可以使用GRANT EXEC在特定程序或schemas或数据库上执行此操作。

  

以下示例授予存储过程的EXECUTE权限   HumanResources.uspUpdateEmployeeHireInfo到一个名为的应用程序角色   Recruiting11。

USE AdventureWorks2012; 
GRANT EXECUTE ON OBJECT::HumanResources.uspUpdateEmployeeHireInfo
    TO Recruiting11;
GO 

答案 1 :(得分:2)

感谢Igor我已经找到了正确的MSDN页面,并且跟随了权限链接。

但是,建议使用所有权链对我来说太复杂了,所以我使用了

WITH EXECUTE AS OWNER

对我的存储过程非常有效。当我使用受限用户登录时,我只看到程序,根本没有表格,我可以执行程序,但甚至不能从表格中选择。

另外,我想提一下这个概念与setuid非常相似,因此我很熟悉。

我将Igors的回复标记为答案,因为所有权链似乎更通用,只是想分享我找到的信息。