一尘不染

创建新数据库时的最佳ANSI选项

sql

我正在为我们的生产环境在SQL Server 2012上创建新数据库。当我使用SQL Server Management
Studio中的“新建数据库…”选项并生成输出时,我得到:

CREATE DATABASE [AAA]
 CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N'AAA', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQL2014\MSSQL\DATA\AAA.mdf' , SIZE = 5120KB , FILEGROWTH = 1024KB )
 LOG ON 
( NAME = N'AAA_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQL2014\MSSQL\DATA\AAA_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%)
GO
ALTER DATABASE [AAA] SET COMPATIBILITY_LEVEL = 120
GO
ALTER DATABASE [AAA] SET ANSI_NULL_DEFAULT OFF 
GO
ALTER DATABASE [AAA] SET ANSI_NULLS OFF 
GO
ALTER DATABASE [AAA] SET ANSI_PADDING OFF 
GO
ALTER DATABASE [AAA] SET ANSI_WARNINGS OFF 
GO
ALTER DATABASE [AAA] SET ARITHABORT OFF 
GO
ALTER DATABASE [AAA] SET AUTO_CLOSE OFF 
GO
ALTER DATABASE [AAA] SET AUTO_SHRINK OFF 
GO
ALTER DATABASE [AAA] SET AUTO_CREATE_STATISTICS ON(INCREMENTAL = OFF)
GO
ALTER DATABASE [AAA] SET AUTO_UPDATE_STATISTICS ON 
GO
ALTER DATABASE [AAA] SET CURSOR_CLOSE_ON_COMMIT OFF 
GO
ALTER DATABASE [AAA] SET CURSOR_DEFAULT  GLOBAL 
GO
ALTER DATABASE [AAA] SET CONCAT_NULL_YIELDS_NULL OFF 
GO
ALTER DATABASE [AAA] SET NUMERIC_ROUNDABORT OFF 
GO
ALTER DATABASE [AAA] SET QUOTED_IDENTIFIER OFF 
GO
ALTER DATABASE [AAA] SET RECURSIVE_TRIGGERS OFF 
GO
ALTER DATABASE [AAA] SET  DISABLE_BROKER 
GO
ALTER DATABASE [AAA] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
GO
ALTER DATABASE [AAA] SET DATE_CORRELATION_OPTIMIZATION OFF 
GO
ALTER DATABASE [AAA] SET PARAMETERIZATION SIMPLE 
GO
ALTER DATABASE [AAA] SET READ_COMMITTED_SNAPSHOT OFF 
GO
ALTER DATABASE [AAA] SET  READ_WRITE 
GO
ALTER DATABASE [AAA] SET RECOVERY SIMPLE 
GO
ALTER DATABASE [AAA] SET  MULTI_USER 
GO
ALTER DATABASE [AAA] SET PAGE_VERIFY CHECKSUM  
GO
ALTER DATABASE [AAA] SET TARGET_RECOVERY_TIME = 0 SECONDS 
GO
ALTER DATABASE [AAA] SET DELAYED_DURABILITY = DISABLED 
GO
USE [AAA]
GO
IF NOT EXISTS (SELECT name FROM sys.filegroups WHERE is_default=1 AND name = N'PRIMARY') ALTER DATABASE [AAA] MODIFY FILEGROUP [PRIMARY] DEFAULT
GO

为什么有这么多ANSI选项默认设置为OFF?服务器实例是由RackSpace代表我们设置的。难道是由于它们在实例中设置了某些默认设置吗?

谢谢克里斯


阅读 192

收藏
2021-05-23

共1个答案

一尘不染

这些选项默认为,OFF因为很可能是在不触及任何默认值的情况下创建和编写了该数据库的脚本。创建数据库后,它实际上是从model系统数据库中克隆的,并且在全新安装的SQL
Server上,数据库中的ANSI设置为OFF,即使其中某些设置(如ANSI_NULLS)是您实际上永远不会想要的选项是OFF任何现代数据库应用程序。事实上,在的情况下,ANSI_NULLS特别是文档指定有能力将其关闭在所有被弃用,但它可能会仍然是一个几年这是真正的案前。

麻烦之处在于:这些设置仍然保留下来OFF是为了旧应用程序的利益,旧应用程序不得不从这些应用程序ON的优点(以及重大更改)中受益时才将这些选项回退。如果会话没有为它们指定任何值,那么将应用数据库设置。

但是大多数应用程序 确实 在会话中指定了这些设置(如果不是显式的话),而是通过其数据访问库隐式地指定了这些设置。根据上的文档SET ANSI_DEFAULTS,该文档可一次切换一系列设置:

连接时,SQL Server的SQL Server本机客户端ODBC驱动程序和SQL Server的SQL Server本机客户端OLE
DB提供程序会自动设置ANSI_DEFAULTSON 。然后,驱动程序和提供程序将CURSOR_CLOSE_ON_COMMIT和设置
IMPLICIT_TRANSACTIONSOFF。将OFF 用于设置SET CURSOR_CLOSE_ON_COMMITSET IMPLICIT_TRANSACTIONS 可以在ODBC数据源进行配置,在ODBC连接属性,或在在应用程序连接到SQL Server之前设置OLE
DB连接属性。缺省值SET ANSI_DEFAULTSOFF用于来自DB-Library应用程序的连接。

DB-
Library是一个旧的访问库,尽管如此,某些古老的应用程序仍在使用它,并且可以选择作为FreeTDS之类的支持源,因此,您仍然经常会遇到故意或无意使用数据库设置的应用程序,但这越来越稀有。

至于这些选项的 最佳
价值,这完全取决于您的用例。如果必须支持期望旧行为的旧应用程序,则可能别无选择,必须将数据库设置保持为开OFF。如果您有一个通过旧库连接的应用程序,但确实希望使用现代SQL语义,则可能需要将它们打开ON。对于所有其他应用程序,应用程序本身可能已经在每个会话的基础上将这些选项设置为其(不正确的)值,而且您配置的内容也将无关紧要。

关于每个选项的讨论以及何时要启用它,ON或者OFF超出合理答案的范围。请查阅它们各自的文档,并制定自己的最佳实践。您可以让诸如SET计算列索引索引选项要求之类的内容指导您,ON在创建它们之前,需要一堆选项(通常认为它们很不错)。

2021-05-23