【问题标题】:mssql Stored Procedure permissions problemmssql存储过程权限问题
【发布时间】:2011-04-02 14:38:17
【问题描述】:

我正在测试 mssql 中的权限并遇到问题。我制作了一个“Countries”表和一个“spCountries”存储过程。现在,我创建了一个用户“silverlight”,并且没有授予它对 Country 表的任何权限。用户可以执行存储过程。

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

如果存储过程执行 EXEC "SELECT * FROM countries" 而不仅仅是 SELECT FROM ...,这也可能吗?

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

有人有想法吗?

【问题讨论】:

  • 我已经更新了答案

标签: sql-server security stored-procedures permissions


【解决方案1】:
SELECT has_perms_by_name('dbo.Countries', 'OBJECT', 'SELECT')

【讨论】:

  • 我希望用户在存储过程中运行查询,但如果不允许则抛出错误或空记录集。
  • @VeeWee SELECT has_perms_by_name('dbo.Countries', 'OBJECT', 'SELECT')
  • 好的,这似乎很好用!我将在我的 sp 中构建它。谢谢!
【解决方案2】:

这是由于ownership chaining。基本上,如果同一个主体(例如 dbo)拥有一个 SP 和一个用于 int 的表,则不会检查该表的权限。
其实,这是有道理的。例如,它允许您授予用户访问某些数据的权限,但只能以 SP 中编码的特定方式。

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

【讨论】:

    【解决方案3】:

    即 SQL Server 中的 how permissions work

    因此,您可以授予存储过程的权限,而无需授予底层对象的权限。这使您可以准确控制人们可以进行的更新等。

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

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

    【讨论】:

    • 当我只放置选择命令(在 sp 中)时,它不会出错。当我放置 exec("SELECT..") 命令(在 sp 中)时,它会给我一个错误。我的主要想法是在 c# 中快速填充多个数据网格。所以我想制作一个以表名作为参数的sp。用户 1 可以看到数据,但用户 2 看不到数据。所以 EXEC(...) 可能是我需要的。比我可能在 c# 中捕获错误并退出表单或其他内容。这是个好主意吗?
    • 您使用的是哪个版本的 SQL Server?您可以将EXEC AS... 与动态 SQL 一起使用,以使其在具有足够权限的帐户的凭据下执行。
    • mssql 2008 服务器。我希望sp在当前用户下运行:每个用户对sp都有执行权限,但是当当前用户对表没有select权限时sp会抛出错误。
    • 对。我想你可以尝试一下,在存储过程本身和 catch 块中使用类似 select top 0 'col1' as col1, 'col2' as col2 的东西来返回一个空的结果集,如果这样可以使 C# 代码更简单。
    • 好的。不知道mssql中有try-catch!非常有帮助,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-02-13
    • 2015-06-07
    • 2012-04-22
    • 2014-01-12
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多