问题描述: 我正在尝试在商业产品(TAC Reservation Assistant)的表上使用 SQLDependency。该数据库是一个大型 Microsoft SQL 2016 数据库,我们对它没有 db_owner 权限(只有 TAC 有)。
我现在正尝试与 TAC 的支持人员一起向 SQL 内部用户授予激活此商业数据库上的 SQLDependency 所需的权限,而不授予我们的 SQL 用户 db_owner 权限。
(有了 db_owner 权限,这可以完美运行而没有错误 - 所以我们的代码是正确的)。
我们已经尝试过的: 到目前为止,我们一直关注此网站上的以下宝贵信息:http://keithelder.net/2009/01/20/sqldependency-and-sql-service-broker-permissions/但是因为我们想要用 SQLDependency 观察的表位于它自己的模式中(tac 而不是 dbo),所以该模式缺少权限,因为我们在 c-sharp 代码中收到以下错误:
错误信息: 启动 Checkin 类型的 WatcherService 时发生未处理的异常。System.Data.SqlClient.SqlException (0x80131904): 指定的架构名称“tac”不存在或者您没有使用它的权限。
目标: 由于上述错误消息没有告诉我们缺少什么确切的权限,我希望得到提示,看看 MS SQL 服务器中是否有某个日志可以准确说明我们没有哪种权限。
有这样的事情存在吗?
亲切的问候,
约翰
答案1
SELECT * FROM fn_my_permissions('tac.TableName', 'OBJECT')
ORDER BY subentity_name, permission_name ;
这将授予您对 tac 架构中表的权限。您已验证架构确实存在,对吗?结果SELECT SERVERPROPERTY('COLLATION')
还将告诉您是否启用了区分大小写;通常不会启用,但如果返回包含以下内容的字符串,CS
则请确保架构为“tac”而不是“TAC”等
答案2
非常感谢您所有的反馈。
虽然不是我的问题的直接答案(但我最初写这个问题的原因) - 作为我和那些来这里遇到同样问题的人的参考 - 这里的资料如何向标准只读 SQL 内部用户授予正确的权限,以便他/她可以激活/停用具有非标准模式的表上的 SQLdependency。
use <database>
GRANT CREATE CONTRACT TO <user>
GRANT CREATE MESSAGE TYPE TO <user>
GRANT CREATE SERVICE TO <user>
GRANT CREATE QUEUE TO <user>
GRANT CREATE PROCEDURE to <user>
GRANT CONTROL ON SCHEMA::<schema> to <user>