什么是更好的 - 将可选参数添加到现有SP或添加新SP?

eas*_*der 7 database sql-server database-design stored-procedures

我有一个生产SQL-Server数据库(报告),有许多存储过程.SP以不同的方式公开暴露给外部世界
- 一些用户可以直接访问SP,一些用户
通过WebService公开
- 而另一些用户通过DCOM层封装为接口.

用户群很大,我们不确切知道哪个用户集使用哪种方法来访问数据库.
我们经常(通过每隔一个月大约1次)来自用户集的请求,通过向输出添加一列或向现有输出添加一组列来修改现有SP,所有其他保持相同.
我们最初通过修改现有SP并将新请求的列添加到输出的末尾来开始这样做.但这打破了其他一些用户群构建的自定义工具,因为他们的工具具有硬编码的列数,因此添加列意味着他们也必须修改他们的工具.

此外,对于某些列,需要复杂逻辑才能将该列放入报告中,这意味着SP性能下降,影响所有用户 - 甚至是那些不需要新列的用户.

我们正在考虑各种解决方法:

1默认参数用于控制流量

通过添加标志作为默认参数来更新现有SP并控制新功能,以控制代码路径.通过使用默认参数,如果Parameter的值设置为true,则仅调用新功能.默认情况下,它设置为False.

优点

  • 不需要新对象.
  • 正在进行的维护不受影响.
  • 测试开销仍然受到控制.

坏处

  • 由于现有SP已修改,因此需要测试现有功能以及新功能.
  • 由于我们没有了解客户端工具如何调用SP,因此我们无法确定我们没有破坏任何东西.
  • 如果同一报告再次被更多请求修改将难以处理 - 意味着更多标志和代码将变得不可读.

2新的存储过程

将为任何更改SP的签名(输入/输出)的要求创建新的存储过程.
新的SP将为现有的东西调用原始存储过程,并在其上添加新需求的逻辑.

优点

  • 这样做的好处是对现有程序没有影响,因此旧逻辑不需要测试.

坏处

  • 需要更改时,需要在数据库中创建新对象.这将是数据库维护的开销.

执行计划是否会根据添加新参数而更改?如果是,那么这可能会对未请求新列的用户产生负面影响.
考虑到SP是数据库的公共接口,如果选择2,接口应该是不可变的?
什么是最佳做法,还是取决于具体情况,选择期权时应该是主要的驱动因素?

提前致谢!

rya*_*234 4

引用您的第一个选择的缺点:

\n\n
\n

如果同一报告再次被更多请求修改,则处理起来会很困难 \xe2\x80\x93 将意味着更多标志,代码将变得不可读。

\n
\n\n

我个人认为这是不修改现有存储过程以适应新列的最大原因。

\n\n

当错误出现在具有多个分支的存储过程中时,调试可能会变得非常困难。另外,正如您所暗示的那样,执行计划可以随着分支/if 语句而改变。(在运行查询时和在存储过程中运行该查询时,sql 使用不同的执行计划?

\n\n

这与面向对象的编码非常相似,您的直觉是正确的,最好是扩展现有对象而不是修改它们。

\n\n

我会采用方法#2。您将拥有更多对象,但至少当出现问题时,您将能够知道受影响的存储过程的范围/影响有限。

\n\n

随着时间的推移,我学会了水平增长对象/数据结构,而不是垂直增长。换句话说,只做新的东西,不要让现有的东西变得越来越大。

\n