1

有没有办法在 SQL Server 中动态更改 CLR 过程的代码?

假设您有一个在 MS SQL Server 2008 R2 中部署了业务逻辑的程序集。这个程序集(或多个程序集)一直在使用(例如,在多个并发查询中为表的每一行调用一些函数)。所以你不能只是放弃组装。有没有办法动态更改我的业务逻辑或执行外部可变代码?

我已经探索过这些方法,但没有一个奏效:

  1. 反射.发射
  2. 莫诺·塞西尔
  3. 在 SQL Server 中部署的程序集中加载外部程序集

更新:问题不在于发布过程:我希望能够通过 GUI 动态设置一些安全规则。

例如,一些用户应该只能看到没有地址的客户或去年的交易等等。

规则并不复杂,但它们几乎每天都在变化,我们不能将它们放入代码中。其余的业务逻辑在 TSQL 中实现。选择 CLR 是因为性能问题(动态 SQL 太慢)。

还有另一种选择:生成集群视图(在 WHERE 部分使用规则),但速度不够快。

更多细节:

假设我们有一些代码选择大表 dbo.Transactions 的一部分

select *
from dbo.Transactions
where ... --filters from your business logic

如果我们想过滤结果以显示允许的行,我们可以生成一些索引视图并将其与结果集连接起来,如下所示:

select *
from dbo.Transactions t
inner join dbo.vw_Transactions v
on t.id = v.id
where ... --filters from your business logic

但是,如果我们在大多数情况下检查执行计划,查询分析器会决定不过滤 dbo.Transaction 然后使用 vw_Transactions 连接,而是先连接然后过滤(这绝对是不可取的)。FORCE ORDER 之类的提示无济于事。

4

2 回答 2

1

我不是 CLR 汇编专家,但显而易见的选择是:

  1. 改变组装
  2. 在事务中删除并重新创建程序集
  3. 定义一个维护窗口,然后部署它

gbn 关于发布流程的观点很好。如果您的程序(以及您的业务运营)真的每天 24 小时不间断地运行,那么大概您已经拥有某种形式的系统冗余并建立了用于修补和升级应用程序的维护程序?如果是这样,只需在通常的维护窗口中部署新代码即可。

于 2011-05-20T15:22:36.517 回答
0

有一个很好的动态评估算术表达式库(带参数) - Flee

在我的情况下,我不必执行任何.Net 代码——只需像“Date > '20100101' Or Status = 2”这样的表达式,所以 Flee 几乎完全满足。唯一的问题是它的逻辑运算符不适用于 SqlBoolean 类型(用于 sql 表达式),但添加此功能并不是什么大问题。

但在一般情况下,似乎不可能在 Sql Server 主机中执行动态 .Net 代码

于 2011-05-30T08:59:01.980 回答