【问题标题】:SQL Server stored procedures and permissions with other databasesSQL Server 存储过程和权限与其他数据库
【发布时间】:2015-02-24 14:58:50
【问题描述】:

我正在为一些新用户配置数据库帐户。我提出了以下解决方案,它是让帐户正常工作的 99%,但我遇到了一个我无法解决的问题。

首先,我创建了一个使用 SQL Server 身份验证的新登录名,然后授予他们对所有存储过程的 EXECUTE 权限。这允许他们全部运行,但他们无法查看代码,也无法查看数据库表。

在存储过程中我添加了以下内容:

WITH EXEC AS OWNER

这允许存储过程作为我们通常使用的默认帐户运行,并且具有db_owner 的角色。这允许新用户运行所有存储过程,并且在我遇到以下问题之前效果很好:

一些存储过程(所有这些都使用动态 SQL)调用一些同义词,这些同义词链接到其他两个数据库(历史和数据集市数据库)中的表。这给了我以下错误:

服务器主体“{username}”无法在当前安全上下文下访问数据库“{database name}”。

我在WITH EXEC AS 中使用的帐户是我正在使用的所有三个数据库中的db_owner

我可以做些什么来解决这个问题?非常感谢

【问题讨论】:

    标签: sql sql-server database stored-procedures permissions


    【解决方案1】:

    EXECUTE AS Owner 是一个数据库沙箱。想一想,它必须。否则,database 管理员可以发出 EXECUTE AS USER = 'somesystemadmin' 并将自己提升为 instance 级别的管理员。详情见Extending Database Impersonation by Using EXECUTE AS

    使用 EXECUTE AS USER 语句模拟主体时,或使用 EXECUTE AS 子句在数据库范围的模块中模拟主体时,默认情况下模拟范围仅限于数据库。这意味着对数据库范围之外的对象的引用将返回错误。

    解决方案很简单:签署程序。有关示例,请参阅Call a procedure in another database from an activated procedure。在Module SigningSigning Stored Procedures in SQL Server 阅读更多内容。

    【讨论】:

    • 我注意到您写的第一篇文章有​​以下代码:ALTER DATABASE [my_database] SET TRUSTWORTHY ON,这似乎将标准 dbo 设置为 sys-admin 级别,您对此有何看法?这不会像您所说的那样使“所有者”用户有效地成为实例管理器用户吗? (顺便说一下,我还没试过)
    • TRUSTWORTHY 也可以,比签名简单得多,但前提是您完全理解并同意安全后果(即db_owner 的所有成员实际上都是sysadmin)。我的意见是花一些精力让签名工作。然后,您可以做出明智的决定来使用哪个。
    • 感谢您的帮助,您是生命的救星!我会仔细阅读签名,因为你是对的,最好做“正确”的事情,我总是努力去做。我今天已经信任了,明天我会尝试添加签名。再次感谢您。
    猜你喜欢
    • 2011-09-22
    • 1970-01-01
    • 2010-09-18
    • 2018-12-19
    • 2010-11-28
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    相关资源
    最近更新 更多