为其他数据库中的内部存储过程设置中央 CLR 存储过程/函数存储库库以使用?

Ale*_*win 18 sql-server-2008 sql-server sql-server-2008-r2 c# sql-clr

我想使用我在 C# CLR 中开发的代码在系统上的所有数据库中使用,这样我就不必将每个数据库都设置为可信赖的并打开 CLR 并在每个数据库中保留一堆相同的代码.

从管理和安全的角度来看,有没有最好的方法来做到这一点?CLR 函数非常基础,如字符串断路器、电子邮件验证、url 编码/解码、base64 等。我希望每个数据库中只有 dbo 模式能够访问这些函数。

  1. 有没有简单的方法可以做到这一点?
  2. 我也不清楚是否嵌入了 CLR dll,如果我移动数据库,它会标记,或者我是否也必须移动 dll。

谢谢

Wor*_*DBA 8

在我们公司,我们有准确的设置。创建 CLR 程序集时,程序集的二进制表示存储在创建它的数据库中。这使您可以在任何时间移动数据库时随身携带它(甚至编写脚本)。

几个月前,我们的数据中心被淹 - 几台服务器都装满了水。当我重建它们时,我只使用了前一天晚上备份的数据库。到目前为止,我们没有遇到任何问题..(触摸木头!)

我不确定从安全角度来看这是否正确,但我们授予对 CLR procs 等访问权限的方式是在共享数据库中创建一个角色,然后将其他数据库中的用户添加到该角色。然后授予该角色在 CLR 进程上执行。

如果 CLR 尝试执行诸如访问它所包含的数据库之外的资源之类的操作,则可能会出现访问问题,但您可以在创建程序集时设置该程序集的权限。下面的链接有更多关于权限的信息,但我在这里无法解释:

http://msdn.microsoft.com/en-us/library/ms345101.aspx

我希望这对你有帮助。


Jon*_*gel 6

程序集二进制文件作为 blob 存储在数据库中,因此它可以随身携带到数据库所在的任何地方。CLR 仅在实例上启用——没有特定于数据库的设置。

无论如何,你为什么要这样做?

(我不是想争辩;我只是想听听所涉及的动机,因为也许可以通过满足您需求的不同方式解决问题。)


除了将程序集放在共享数据库中之外,没有其他方法可以轻松做到这一点。

也就是说,我认为采用以数据库为中心的架构是有利的,除非有非常令人信服的理由需要集中化的特定情况。原因是将程序集(或任何与此相关的东西)放在数据库之外会在您的环境中创建依赖项。这与 Microsoft 从 SQL Server 2012 开始构建包含数据库的方法正好相反。

  • 当您开始需要使用复制或集群等功能时,这种依赖性可能会极大地增加部署的复杂性,还会增加故障排除和故障转移过程。

  • 对于不熟悉该系统的人来说,这种架构不太明显(即,它不太容易自我发现,也不太容易自我记录)。

  • 如果您最终需要在不同的数据库中使用不同的安全性,或者任何涉及变化的事物,那么您就会陷入困境。

  • 如果这些数据库被部署给客户(听起来他们不会,但为了完整性我会这样说),这会增加部署过程、维护和故障排除的复杂性。

  • 由于所有数据库都会共享此代码,如果引入(或修复!)任何错误,这可能会破坏所有依赖数据库的应用程序。全面的单元测试绝对是必须的。

如果您有多个需要相同功能的数据库,还有其他方法可以减少所涉及的重复量,我认为这就是练习的重点。与数据库本身中的数据相比,即使是相当复杂的 CLR 程序集也不会占用太多物理存储空间(几乎总是如此),所以我不认为这是一个有效的论点,除非您确实有成千上万个需要它的小型数据库集会。

您可以做的是修改这些数据库部署过程的其他部分,以减少源重复。例如,从源代码管理中 CLR 代码的公共位置构建和部署程序集。或者,创建将相同程序集部署到数据库的脚本。尽可能自动化这部分事情,这不会有什么大不了的。

我同意我的建议是一种权衡,因为仍然会有一些重复,但这必须与实施不遵循规定标准的架构所涉及的负面因素相平衡。只有您可以决定什么适合您的环境。