设置时
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
设置为用户拥有的,那么它就可以工作(当然)。
我正在使用 SQL Server 2012
我已经查看了this相关问题,但是在模式上为用户提供
ALTER
和/或CONTROL
似乎不起作用。更新:我看到最近对此答案的反对票。我认为是时候更新答案了,因为它不相关,但如果用户能够查看答案日期(大约 6 年前),我将不胜感激。无论如何,这里有详细的答案:
为什么使用角色拥有的模式时会出现错误?
1) 角色与用户所有权: 在 SQL Server 中,角色主要用于管理权限,而不是像用户那样拥有对象。 SQL Server 使用所有权链的概念来允许在访问存储过程时安全地访问基础对象(如表、视图等),但它对于角色的工作方式与对于用户或用户拥有的架构的工作方式不同。角色拥有架构可能会导致 SQL Server 无法建立清晰的所有权链的问题。
2)权限检查:当执行SqlDependency.Start()时,SQL Server会尝试确保执行上下文(用户)有足够的权限来访问或创建必要的对象,例如过程、队列和服务。如果架构由角色拥有,SQL Server 可能会难以验证这些权限,因为角色的安全上下文与用户的安全上下文不同。角色没有与其关联的直接登录;它们是权限的集合。这可能会使 SqlDependency 所需的特定操作的权限解析变得复杂。
可能的解决方案:
-- 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;
使用 DEFAULT_SCHEMA = dbo 更改用户 [用户名];
-- 角色具有适当的权限 GRANT CREATE PROCEDURE、CREATE QUEUE、CREATE SERVICE、SUBSCRIBE QUERY NOTIFICATIONS、RECEIVE ON QueryNotificationErrorsQueue TO sql_dependency_user;