2010-02-23 57 views
0

我们在.Net 3.5中工作,我们在代码中有SqlDependency,它需要.Net用户拥有CREATE权限和其他权限。
DBA在这里想要避免给.Net用户这么多的权限。用手工代码代替SqlDependency

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

谢谢!


以供将来参考,我只想说,我们解决了权限问题用一个非常简单的解决方案:使用的SqlDependency不同的连接字符串使用具有不同的权限,经常.NET连接字符串的用户。

+0

您可能只需通过IPC通道进行远程操作即可轻松完成此操作。 – leppie 2010-02-23 15:58:21

+1

为什么用户需要CREATE权限?我以为他们只需要'SqlClientPermission.Unrestricted'和SUBSCRIBE QUERY NOTIFICATIONS数据库权限。 (Per http://msdn.microsoft.com/en-us/library/ms172133.aspx)您是否建议允许用户在任意服务器上启用查询通知? (因为设置代码确实需要一些修改和创建语句。) – 2010-02-23 16:10:01

回答

7

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

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

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

+0

+1,感谢清除了一些,Remus。 – 2010-02-23 21:32:43

0

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

如果所有对象(表,存储过程等)都属于同一所有者(多次dbo),则您的客户端权限只需要访问权限即可执行他们所需的存储过程。