Sql server SQL Server 2000-如何恢复连接级别设置的先前状态

Sql server SQL Server 2000-如何恢复连接级别设置的先前状态,sql-server,tsql,sql-server-2000,dbdeploy,Sql Server,Tsql,Sql Server 2000,Dbdeploy,我在T-SQL代码库中使用DBDeploy.NET进行更改控制管理。DBDeploy由开发人员维护一组编号的更改脚本。当触发部署(通过NAnt)时,DBDeploy会查看一个changelog表,并确定需要执行哪些修补程序来更新实例 我遇到的问题是设置创建索引视图所需的设置。QUOTED_标识符、ANSI_NULL和ARITHABORT都需要启用。是的,我可以轻松地将这些SET语句放在创建/更改索引视图的更改脚本的顶部。但是这些设置是连接级别的。如果以后我从头开始构建一个新实例呢?当我在新实例上

我在T-SQL代码库中使用DBDeploy.NET进行更改控制管理。DBDeploy由开发人员维护一组编号的更改脚本。当触发部署(通过NAnt)时,DBDeploy会查看一个changelog表,并确定需要执行哪些修补程序来更新实例

我遇到的问题是设置创建索引视图所需的设置。QUOTED_标识符、ANSI_NULL和ARITHABORT都需要启用。是的,我可以轻松地将这些SET语句放在创建/更改索引视图的更改脚本的顶部。但是这些设置是连接级别的。如果以后我从头开始构建一个新实例呢?当我在新实例上运行DBDeploy时,这些设置将渗透到所有后续的更改脚本,因为所有更改脚本都有效地连接到要在单个连接上执行的最终SQL脚本中。更糟糕的是,诸如QUOTED_IDENTIFIER之类的解析时间选项也将应用于之前的所有更改脚本。因此:

  • 我使用的是SQL Server 2000。我对连接级别设置的解释正确吗?也就是说,使用GO将脚本分为多个批,不会限制这些设置选项的范围。对于连接级别设置已重命名为批处理级别的更高版本,情况如何
  • 有没有办法把布景取消?据我所知,连接级别设置是三元的,即ON、OFF和default,其中default根据SQL语句的内容、实例设置、数据库设置和持久化用户设置进行解释。如果我将某个设置为“开”,我无法撤消它,只需将其设置为“关”,即可撤消它,因为它会屏蔽默认值,如果之前的设置是这样的话
  • 有没有办法在设置连接级别设置之前保存其状态,以便在设置之后手动恢复
  • 替代方案包括:

  • 我可以在动态SQL中包装索引视图的每个create/alter语句,SS2K上有4000/8000个字符的限制。这将很好地限制SET语句的范围
  • 我可以制定一个策略,修复要在项目级别使用的集合选项,并要求所有开发人员将这些集合选项放在每个更改脚本的顶部以强制执行,因为直到部署时才确切知道将应用哪些更改脚本
  • 我可以将DBDeploy自身修补为始终为每个更改脚本使用新连接,但这需要重新设计它处理撤消更改脚本的方式

  • 那么可以做些什么,我应该做些什么?

    不幸的是,我不相信有办法获取连接中的当前设置状态

    我不使用DBDeploy.NET,但这听起来确实像是该工具的一个限制。DBDeploy.NET应该在项目元数据(如在Visual Studio DB项目中)中定义它随后部署的任何数据库的SET谓词默认值

    为了避免脚本之间的“出血”,它应该在将每个脚本连接到最终脚本之前,使用这些项目级默认值自动添加SET语句


    拥有这种确定性方法意味着开发人员可以清楚地知道当脚本执行时,这些集合将处于什么状态。否则,脚本将受到SQL客户端连接或服务器实例中存在的各种默认值的影响。

    不幸的是,我不相信有办法获取连接中的当前设置状态

    我不使用DBDeploy.NET,但这听起来确实像是该工具的一个限制。DBDeploy.NET应该在项目元数据(如在Visual Studio DB项目中)中定义它随后部署的任何数据库的SET谓词默认值

    为了避免脚本之间的“出血”,它应该在将每个脚本连接到最终脚本之前,使用这些项目级默认值自动添加SET语句


    拥有这种确定性方法意味着开发人员可以清楚地知道当脚本执行时,这些集合将处于什么状态。否则,脚本将受到SQL客户端连接或服务器实例中存在的各种默认值的影响。

    您也可以在处尝试此问题。您也可以在处尝试此问题。