Sql server 2008 r2 如何在存储过程中使用功能标志

Sql server 2008 r2 如何在存储过程中使用功能标志,sql-server-2008-r2,continuous-delivery,Sql Server 2008 R2,Continuous Delivery,我正在开发一个系统,它几乎所有的逻辑都在SQL Server存储过程中。作为改进开发实践的一部分,我们希望使用特性标志(也称为切换)来实现生产中的功能,从而转向连续交付模型 如何编写存储的进程,使它们能够有效地检查标志,而不会在每次调用该进程时通过敲打配置表来向数据库添加负载?您可以在会话或连接的生命周期中存储128字节的标志 创建一个函数以检索标志值: create function dbo.GetConfigFlags() returns VarBinary(128) begin -

我正在开发一个系统,它几乎所有的逻辑都在SQL Server存储过程中。作为改进开发实践的一部分,我们希望使用特性标志(也称为切换)来实现生产中的功能,从而转向连续交付模型

如何编写存储的进程,使它们能够有效地检查标志,而不会在每次调用该进程时通过敲打配置表来向数据库添加负载?

您可以在会话或连接的生命周期中存储128字节的标志

创建一个函数以检索标志值:

create function dbo.GetConfigFlags() returns VarBinary(128)
  begin
  -- Retrieve the configuration flag values.
  --   This can be context sensitive, e.g. return different values based on user, server, ... .
  declare @Result as VarBinary(128)
  if Context_Info() is NULL
    set @Result = 12345 -- Get value from table or hard code here.
  else
    set @Result = Context_info()
  return @Result
  end
使用代码启动每个存储过程,如果尚未加载标志,则这些代码将获取标志:

if Context_Info() is NULL
  begin
  declare @ConfigFlags as VarBinary(128) = dbo.GetConfigFlags()
  set Context_Info @ConfigFlags -- This is not allowed within a function.
  end
select Context_Info() -- Demo.

丑陋的部分是管理比特的意义。

我不认为您需要针对一个您不知道将要存在的性能问题进行过早的优化。如果您的表有100行,并且经常被引用,那么它几乎肯定100%的时间都在内存中,访问也不会有问题

我们使代码向前兼容的一种方法是向过程中添加一个参数,使用默认值,当应用程序准备好升级时,应用程序可以“升级”。这可以通过一个配置文件参数来完成,但无论如何,应用程序都必须重新编译以利用新功能

举个简单的例子:

CREATE PROCEDURE dbo.doStuff
  @version DECIMAL(10,2) = 1.0
AS
BEGIN
  SET NOCOUNT ON;

  IF @version >= 1.1 
  BEGIN
    PRINT 'This only executes if the app tells us it is 1.1 or newer.';
  END

  IF @version >= 2.5
  BEGIN
    PRINT 'This only executes if the app tells us it is 2.5 or newer.';
  END
END
GO

当所有应用程序都是最新的时,您可以根据参数增加基本版本。否则,它们都可以以自己的速率更新,模式可以以不同的速率进行。如果您可以将每个特性关联到一个连续的点版本,那么管理起来应该不会太困难。但我要再次强调,一个100行的表不会像你想象的那样拖累你的性能…

我们讨论了多少标志/功能?平均多久调用一次存储过程?新功能所需的典型更改的性质是什么?在我以前的工作中,我们能够使几乎所有的功能增强完全向后兼容-直到我们想要,应用才知道它们。proc一直被调用-这是一个相当大和繁忙的应用。作为正常开发的一部分,标志的数量将随着时间的推移而增加。它们将定期被剔除,但我不确定高水位线会是什么-我估计超过100。你能举一个依赖于标志的过程行为变化的例子吗?你可以在函数中对它们进行编码,而不是将值保存在表中。每个值一个函数(
fnGetZIPCodeSize()
),或者传入一个参数以选择适当的输出值(
fnConfigValue(@Param as VarChar(42))
)。避免表访问,无争用,易于修改。您可以通过功能集、调用函数的函数、在特定日期切换的功能等使其复杂化@哈博:我不确定这会比一个索引良好的表(几乎可以肯定总是在内存中)高效多少。我还发现在函数中硬编码的数据很难查看和维护。我喜欢这个方法,虽然它是一个标志检查而不是版本检查。这让我意识到,标志可能更好地来自应用程序而不是数据库——这是我想到的方法,因为我们已经习惯于在程序中做任何事情。如果它来自应用程序,我可以将值存储在配置文件中,以便在应用程序和数据库中使用。