我有一个包含许多存储过程的生产 SQL-Server 数据库(报告)。SP 以不同的方式向外部世界公开
- 一些用户可以直接访问 SP,
- 有些通过 WebService 公开
- 而另一些则通过 DCOM 层封装为接口。
用户群很大,我们不确切知道哪个用户集使用哪种方法访问数据库。
我们收到来自用户组的频繁(大约每隔一个月 1 个)请求,通过向输出添加一列或向现有输出添加一组列来修改现有 SP,其他所有内容保持不变。
我们最初通过修改现有 SP 并将新请求的列添加到输出的末尾来开始执行此操作。但这破坏了其他一些用户群构建的自定义工具,因为他们的工具具有硬编码的列数,因此添加列意味着他们也必须修改他们的工具。
此外,对于某些列,需要复杂的逻辑才能将该列放入报告中,这意味着 SP 性能下降,影响所有用户 - 甚至那些不需要新列的用户。
我们正在考虑各种方法来解决这个问题:
1 控制流的默认参数
通过添加标志作为默认参数来控制代码路径,更新现有 SP 并控制新功能。通过使用默认参数,如果 Parameter 的值设置为 true,则仅调用新功能。默认情况下,它设置为 False。
优势
- 不需要新对象。
- 正在进行的维护不受影响。
- 测试开销仍在控制之中。
坏处
- 由于现有 SP 已修改,因此需要对现有功能和新功能进行测试。
- 由于我们不知道客户端工具如何调用 SP,我们永远无法确定我们没有破坏任何东西。
- 如果相同的报告再次被更多请求修改,将很难处理——这意味着更多的标志和代码将变得不可读。
2 新建存储过程
将为更改 SP 的签名(输入/输出)的任何需求创建一个新的存储过程。
新的 SP 将为现有的东西调用原始存储过程,并在其之上添加新需求的逻辑。
优势
- 这样做的好处是不会对现有程序产生影响,因此不需要对旧逻辑进行测试。
坏处
- 每当请求更改时,都需要在数据库中创建新对象。这将是数据库维护的开销。
执行计划是否会因添加新参数而改变?如果是,那么这可能会对未请求新列的用户产生不利影响。
考虑到 SP 是数据库的公共接口,如果我们选择选项 2,接口应该是不可变的?
最佳实践是什么,还是取决于具体情况,选择选项时的主要驱动因素是什么?
提前致谢!