mssql存储过程权限问题

时间:2010-08-23 11:47:39

标签: sql-server security stored-procedures permissions

我正在测试mssql中的权限并遇到问题。我制作了'国家'表和'spCountries'存储过程。现在我已经创建了一个用户'silverlight'并且没有对Countries表赋予它任何权利。用户可以执行存储过程。

现在,当我选择它时它会失败,但是在exec spCountries中,数据是可见的。如何检查存储过程中的权限?

如果存储过程执行EXEC“SELECT * FROM Countries”而不仅仅是SELECT FROM ...吗?

也许最好只返回空记录集而不是错误...

有人有想法吗?

3 个答案:

答案 0 :(得分:3)

SELECT has_perms_by_name('dbo.Countries', 'OBJECT', 'SELECT')

答案 1 :(得分:2)

那是由于ownership chaining。基本上,如果相同的主体(例如dbo)拥有SP和使用它的表,则不检查表的权限。
实际上,这是有道理的。例如,它允许您向用户提供对某些数据的访问权限,但仅限于在SP中编码的特定方式。

如果使用动态SQL,则每次都会计算权限。从SQL2005开始,您可以使用EXECUTE AS子句指定执行上下文。例如,EXECUTE AS OWNER使SP中的动态SQL在SP所有者的上下文中执行,从而对使用静态SQL的所有权链接产生类似的效果。

答案 2 :(得分:1)

在SQL Server中是how permissions work

因此,您可以在不必为基础对象授予权限的情况下授予存储过程的权限。这使您可以精确控制人们可以进行的更新等。

如果您不希望它们执行存储过程,请不要授予用户silverlight权限!

修改:虽然再次阅读了这个问题但听起来可能是this is the kind of thing you need