SqlDependency、最小数据库权限和角色拥有的架构

问题描述 投票:0回答:1

背景:

设置时

SqlDependency
我使用这些文章中找到的信息来为数据库用户提供所需的最低权限:

最终得到这样的结果:

CREATE ROLE [sql_dependency_user] AUTHORIZATION [dbo];
GRANT REFERENCES ON CONTRACT::[http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification] TO [sql_dependency_user];

-- for Start()
GRANT CREATE PROCEDURE to [sql_dependency_user];
GRANT CREATE QUEUE to [sql_dependency_user];
GRANT CREATE SERVICE to [sql_dependency_user];
GRANT VIEW DEFINITION TO [sql_dependency_user];

-- for subscribe
GRANT SUBSCRIBE QUERY NOTIFICATIONS TO [sql_dependency_user];
GRANT RECEIVE ON QueryNotificationErrorsQueue TO [sql_dependency_user];

问题:

如果我创建此角色拥有的架构,并将用户添加到此角色(如上面的 keithelder 链接中):

CREATE SCHEMA [sql_dependency] AUTHORIZATION [sql_dependency_user]
ALTER USER [user_name] WITH DEFAULT_SCHEMA = [sql_dependency]

SqlDependency.Start()
抛出错误:

找不到指定的用户“所有者”。
找不到队列“SqlQueryNotificationService-00000000-0000-0000-0000-000000000000”,因为它不存在或您没有权限。
无效的对象名称“SqlQueryNotificationService-00000000-0000-0000-0000-000000000000”。

但是,如果我将用户的

DEFAULT_SCHEMA
设置为用户拥有的,那么它就可以工作(当然)。

问题:

  1. 为什么使用角色拥有的模式时会出现错误?
  2. 如果我想避免为每个用户创建架构,有哪些选项?

可能有用的信息:

  • 我正在使用 SQL Server 2012

  • 我已经查看了this相关问题,但是在模式上为用户提供

    ALTER
    和/或
    CONTROL
    似乎不起作用。

c# sql-server sql-server-2012 sqldependency
1个回答
-1
投票

更新:我看到最近对此答案的反对票。我认为是时候更新答案了,因为它不相关,但如果用户能够查看答案日期(大约 6 年前),我将不胜感激。无论如何,这里有详细的答案:

为什么使用角色拥有的模式时会出现错误?

1) 角色与用户所有权: 在 SQL Server 中,角色主要用于管理权限,而不是像用户那样拥有对象。 SQL Server 使用所有权链的概念来允许在访问存储过程时安全地访问基础对象(如表、视图等),但它对于角色的工作方式与对于用户或用户拥有的架构的工作方式不同。角色拥有架构可能会导致 SQL Server 无法建立清晰的所有权链的问题。

2)权限检查:当执行SqlDependency.Start()时,SQL Server会尝试确保执行上下文(用户)有足够的权限来访问或创建必要的对象,例如过程、队列和服务。如果架构由角色拥有,SQL Server 可能会难以验证这些权限,因为角色的安全上下文与用户的安全上下文不同。角色没有与其关联的直接登录;它们是权限的集合。这可能会使 SqlDependency 所需的特定操作的权限解析变得复杂。

可能的解决方案:

  1. 使用用户或 dbo 拥有的共享架构:您可以创建数据库用户或 dbo 拥有的共享架构,而不是角色拥有的架构。然后,该用户将向该角色授予必要的权限,并且该角色可以将这些权限授予其成员。以下是构建它的方法:
-- Create schema owned by dbo or a specific user
CREATE SCHEMA sql_dependency AUTHORIZATION dbo;

-- Grant permissions to the role
GRANT SELECT, INSERT, UPDATE, DELETE ON SCHEMA::sql_dependency TO sql_dependency_user;
  1. 默认架构为 dbo(如果特定架构设置导致复杂性):如果管理架构变得过于复杂,则为用户设置默认架构为 dbo 可能是一种更简单的方法。虽然这减少了特定模式中对象的封装,但它可以简化权限管理:

使用 DEFAULT_SCHEMA = dbo 更改用户 [用户名];

  1. 确保分配适当的权限:无论架构所有权如何,请确保创建和管理 SQL Service Broker 对象(如队列和服务)以及订阅通知所需的所有权限均已显式授予角色并正确传播到其角色会员。

-- 角色具有适当的权限 GRANT CREATE PROCEDURE、CREATE QUEUE、CREATE SERVICE、SUBSCRIBE QUERY NOTIFICATIONS、RECEIVE ON QueryNotificationErrorsQueue TO sql_dependency_user;

© www.soinside.com 2019 - 2024. All rights reserved.