我正在测试mssql中的权限并遇到问题。我制作了'国家'表和'spCountries'存储过程。现在我已经创建了一个用户'silverlight'并且没有对Countries表赋予它任何权利。用户可以执行存储过程。
现在,当我选择它时它会失败,但是在exec spCountries中,数据是可见的。如何检查存储过程中的权限?
如果存储过程执行EXEC“SELECT * FROM Countries”而不仅仅是SELECT FROM ...吗?
也许最好只返回空记录集而不是错误...
有人有想法吗?
答案 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?