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

Chr*_*lsh 5 sql sql-server sql-server-2012

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

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
Run Code Online (Sandbox Code Playgroud)

为什么这么多 ANSI 选项默认为 OFF?服务器实例是由 RackSpace 代表我们设置的。可能是因为他们在实例中设置了一些默认值?

谢谢,克里斯

Jer*_*ert 2

这些选项默认为OFF,因为很可能该数据库是在没有触及任何默认值的情况下创建和编写的。创建数据库时,它本质上是从model系统数据库克隆的,并且在全新安装的 SQL Server 上,数据库上的 ANSI 设置将为OFF,即使其中一些设置(例如ANSI_NULLS)是您真正不想选择的选项适用OFF于任何现代数据库应用程序。事实上,在特定的情况下,文档指定完全不推荐ANSI_NULLS将其关闭的功能,尽管可能还需要几年时间才能真正实现这种情况。

问题就在这里:这些设置仍然保留是OFF为了旧应用程序的利益,旧应用程序必须ON在从它们的好处(和破坏性更改)中受益时将这些选项调回来。如果会话没有为它们指定值,则应用数据库设置。

但大多数应用程序确实在会话中指定这些设置,如果没有显式指定,则通过其数据访问库隐式指定。根据 的文档SET ANSI_DEFAULTS,它一次切换一堆设置:

SQL Server Native Client ODBC 驱动程序和 SQL Server Native Client OLE DB 提供程序在连接时自动设置ANSI_DEFAULTSON 。然后驱动程序和提供程序将 CURSOR_CLOSE_ON_COMMIT和设置IMPLICIT_TRANSACTIONSOFF。和 的OFF 设置可以 在 ODBC 数据源、ODBC 连接属性或连接到 SQL Server 之前在应用程序中设置的 OLE DB 连接属性中进行配置。默认值用于 来自 DB-Library 应用程序的连接。SET CURSOR_CLOSE_ON_COMMITSET IMPLICIT_TRANSACTIONSSET ANSI_DEFAULTSOFF

DB-Library 是一个旧的访问库,但仍然被一些古老的应用程序使用,并且可以选择作为 FreeTDS 之类的后备源,因此您仍然经常会遇到有意或无意使用数据库设置的应用程序,但是这个越来越少见。

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

对每个选项以及您何时想要改变它ONOFF超出合理答案的限制进行讨论。请参阅每个文档的文档并制定您自己的最佳实践。您可以让诸如SET计算列索引的选项要求之类的内容来指导您,这需要一堆选项才能ON创建它们(并且通常认为拥有它们是一件好事)。