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

时间:2016-11-30 15:30:20

标签: sql sql-server sql-server-2012

我正在为我们的生产环境在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代表我们设置。可能是因为他们在实例中设置了一些默认值吗?

谢谢, 克里斯

1 个答案:

答案 0 :(得分:1)

选项默认为OFF,因为这个数据库很可能是在不触及任何默认值的情况下创建和编写脚本的。创建数据库时,它基本上是从model系统数据库克隆的,并且在全新安装的SQL Server上,数据库上的ANSI设置将为OFF,即使其中一些设置(像ANSI_NULLS这样的选项,对于任何现代数据库应用程序来说都是绝对不可能成为OFF的选项。实际上,特别是在ANSI_NULLS的情况下,文档指出完全关闭它的能力是deprecated,尽管可能还需要几年时间才真正如此。< / p>

这就是问题所在:为了旧应用程序的利益,这些设置仍然保留OFF,旧应用程序必须将这些选项ON转回来,以便从他们的善良中获益(并且改变) 。如果会话未指定它们的值,则应用数据库设置。

但是大多数应用程序在会话中指定这些设置(如果不是显式的),然后通过其数据访问库隐式指定。根据{{​​3}}上的文档,它会立即切换一堆设置:

  

SQL Server Native Client ODBC驱动程序和SQL Server Native Client   SQL Server的OLE DB提供程序自动将ANSI_DEFAULTS设置为ON   连接时然后设置驱动程序和提供程序   CURSOR_CLOSE_ON_COMMITIMPLICIT_TRANSACTIONSOFFOFF   SET CURSOR_CLOSE_ON_COMMITSET IMPLICIT_TRANSACTIONS的设置   可以在ODBC数据源中配置,在ODBC连接属性中,   或者在应用程序中设置的OLE DB连接属性中   在连接到SQL Server之前。 SET ANSI_DEFAULTS的默认值为   OFF用于DB-Library应用程序的连接。

DB-Library是一个旧的访问库,但仍然被一些古老的应用程序使用,并且可选地作为FreeTDS之类的东西的后备源,所以你经常会遇到故意或意外使用数据库设置的应用程序,但这种情况越来越少了。

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

有关每个选项的讨论以及何时需要将其ONOFF转换为合理答案的限制。请查阅每个文档,并制定您自己的最佳实践。您可以让SET ANSI_DEFAULTS之类的东西引导您,这需要一堆选项ON才能创建它们(而且它们通常被认为是一件好事)。