【问题标题】:Replacing SqlDependency with manual code用手动代码替换 SqlDependency
【发布时间】:2011-01-20 03:25:19
【问题描述】:

我们工作在.Net 3.5,代码中有SqlDependency,需要.Net用户有CREATE权限等权限。
这里的 DBA 想要避免给 .Net 用户如此巨大的权限。

有没有办法通过手动执行 SqlDependency 的操作来绕过 SqlDependency?运行具有比 .net 更多权限的后台进程并创建必要的程序等?

谢谢!


为了以后的参考,我只想说我们通过一个非常简单的解决方案解决了权限问题:SqlDependency 使用不同的连接字符串与具有与常规 .net 连接字符串不同权限的用户。

【问题讨论】:

  • 您可以很容易地通过 IPC 通道进行远程处理。
  • 为什么用户需要 CREATE 权限?我以为他们只需要 SqlClientPermission.Unrestricted 和 SUBSCRIBE QUERY NOTIFICATIONS 数据库权限。 (根据msdn.microsoft.com/en-us/library/ms172133.aspx)您是否建议允许用户在任意服务器上启用查询通知? (因为设置代码确实需要一些 alter 和 create 语句。)

标签: c# sql-server .net-3.5


【解决方案1】:

请改用SqlNotificationRequest。这是构建 SqlDependency 的基础类。要了解 SqlDependency 的工作原理,请继续阅读 The Mysterious Notification

为了接收查询通知,您必须拥有有效的服务和队列。应用程序实例不能共享服务和队列,因为它们会收到彼此的通知。这就是为什么 SqlDependency 选择对临时服务、队列和过程进行“即时”部署(当您调用 Start() 时),这就是要求拥有 CREATE 权限的原因。

较低级别的 SqlNotificationRequest 允许您指定要使用的服务(以及队列),但缺点是服务和队列必须已经存在。但是,您可以在安装阶段由特权管理员运行安装程序或 .msi 时创建它们。当用户调用时,代码使用已经创建的服务。但同样,您必须为 每个 应用程序实例(即为每个 appdomain)创建一个服务,这使事情变得有点复杂。

【讨论】:

    【解决方案2】:

    为什么不能使用存储过程来处理这个任务?它们是从客户端代码中抽象出权限和数据库逻辑的一种方式。

    如果所有对象(表、存储过程等)都归同一所有者所有(很多时候是 dbo),那么您的客户端权限只需要访问权限即可执行他们需要的存储过程。

    【讨论】:

      猜你喜欢
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 2016-05-12
      相关资源
      最近更新 更多