1

我需要限制用户对 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,所有对象(表和存储过程)都在自定义架构中。

4

2 回答 2

3

您可以在特定过程或模式或数据库上使用GRANT EXEC来执行此操作。

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

USE AdventureWorks2012; 
GRANT EXECUTE ON OBJECT::HumanResources.uspUpdateEmployeeHireInfo
    TO Recruiting11;
GO 
于 2013-09-16T07:13:59.913 回答
2

感谢Igor,我找到了正确的 MSDN 页面,并遵循了权利链接。

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

WITH EXECUTE AS OWNER

在我的存储过程上,效果很好。当我使用受限用户登录时,我只看到程序,根本看不到表,我可以执行程序,但甚至不能从表中选择。

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

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

于 2013-09-16T08:15:10.113 回答