我正在为我们的生产环境在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代表我们设置的。难道是由于它们在实例中设置了某些默认设置吗?
谢谢克里斯
这些选项默认为,OFF因为很可能是在不触及任何默认值的情况下创建和编写了该数据库的脚本。创建数据库后,它实际上是从model系统数据库中克隆的,并且在全新安装的SQL Server上,数据库中的ANSI设置为OFF,即使其中某些设置(如ANSI_NULLS)是您实际上永远不会想要的选项是OFF任何现代数据库应用程序。事实上,在的情况下,ANSI_NULLS特别是文档指定有能力将其关闭在所有被弃用,但它可能会仍然是一个几年这是真正的案前。
OFF
model
ANSI_NULLS
麻烦之处在于:这些设置仍然保留下来OFF是为了旧应用程序的利益,旧应用程序不得不从这些应用程序ON的优点(以及重大更改)中受益时才将这些选项回退。如果会话没有为它们指定任何值,那么将应用数据库设置。
ON
但是大多数应用程序 确实 在会话中指定了这些设置(如果不是显式的话),而是通过其数据访问库隐式地指定了这些设置。根据上的文档SET ANSI_DEFAULTS,该文档可一次切换一系列设置:
SET ANSI_DEFAULTS
连接时,SQL Server的SQL Server本机客户端ODBC驱动程序和SQL Server的SQL Server本机客户端OLE DB提供程序会自动设置ANSI_DEFAULTS为ON 。然后,驱动程序和提供程序将CURSOR_CLOSE_ON_COMMIT和设置 IMPLICIT_TRANSACTIONS为OFF。将OFF 用于设置SET CURSOR_CLOSE_ON_COMMIT和SET IMPLICIT_TRANSACTIONS 可以在ODBC数据源进行配置,在ODBC连接属性,或在在应用程序连接到SQL Server之前设置OLE DB连接属性。缺省值SET ANSI_DEFAULTS是 OFF用于来自DB-Library应用程序的连接。
ANSI_DEFAULTS
CURSOR_CLOSE_ON_COMMIT
IMPLICIT_TRANSACTIONS
SET CURSOR_CLOSE_ON_COMMIT
SET IMPLICIT_TRANSACTIONS
DB- Library是一个旧的访问库,尽管如此,某些古老的应用程序仍在使用它,并且可以选择作为FreeTDS之类的支持源,因此,您仍然经常会遇到故意或无意使用数据库设置的应用程序,但这越来越稀有。
至于这些选项的 最佳 价值,这完全取决于您的用例。如果必须支持期望旧行为的旧应用程序,则可能别无选择,必须将数据库设置保持为开OFF。如果您有一个通过旧库连接的应用程序,但确实希望使用现代SQL语义,则可能需要将它们打开ON。对于所有其他应用程序,应用程序本身可能已经在每个会话的基础上将这些选项设置为其(不正确的)值,而且您配置的内容也将无关紧要。
关于每个选项的讨论以及何时要启用它,ON或者OFF超出合理答案的范围。请查阅它们各自的文档,并制定自己的最佳实践。您可以让诸如SET计算列索引索引的选项要求之类的内容指导您,ON在创建它们之前,需要一堆选项(通常认为它们很不错)。
SET