2016-11-30 45 views
4

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

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选项默认为关闭? 服务器实例是由RackSpace代表我们设置的。这可能是因为他们在实例中设置了一些默认值?

谢谢, 克里斯

+2

好问题。其中的每一个设置本身都是一个主题。我认为没有人能够在堆栈溢出的长度限制中给出一个很好的答案。如果有任何你关心的问题,我会分开询问他们(谷歌之后)。我所看到的一件事是,您的日志文件设置为增长一个百分比,如果您可以将其更改为一个固定的数量,它可能是最好的。 –

+1

感谢@RichBenner获取有关自动增长百分比的信息。最让我困扰的设置是'ANSI_NULLS'。标准告诉我,'NULL = NULL'应该返回'UNKNOWN' /'NULL'(即选项为ON时)而不是'TRUE'(当选项为OFF时),但默认情况下是后者(OFF)网站建议将其设置为OFF:https://www.simple-talk.com/sql/database-administration/database-properties-health-check/ –

+0

简单对话的建议是健全的。一般而言,您不希望创建默认允许空值的列。 –

回答

1

的选项默认为OFF,因为在所有的可能性,创建该数据库,不接触任何默认的脚本。当创建数据库时,它基本上是从model系统数据库克隆的,并且在全新安装的SQL Server上,数据库上的ANSI设置将为OFF,尽管其中一些设置(如ANSI_NULLS)是您真正需要的选项对于任何现代数据库应用程序,从不想成为OFF。事实上,特别是在ANSI_NULLS的情况下,该文件指出完全关闭它的能力是deprecated,虽然它可能仍然是几年前的情况。

其中还存在一些问题:这些设置仍旧保留为OFF,因为旧应用程序需要从这些选项中获益(以及突破性更改)才能将这些选项变为ON。如果会话没有为它们指定值,则应用数据库设置。

但大多数应用程序指定这些设置在一个会话,如果不明确,然后隐式通过他们的数据访问库。每对SET ANSI_DEFAULTS的文档,这一次切换一堆的设置:

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

的DB-Library是仍然仍然使用一些古老的应用程序和可选的喜欢的事情freetds的后备源的旧访问库,因此时常仍然可以运行成有意或无意使用的应用程序数据库设置,但这种情况越来越少见。

至于最佳这些选项的值,这完全取决于您的使用情况。如果您必须支持预期旧行为的旧应用程序,则可能无法在OFF上保留数据库设置。如果你有一个应用程序通过一个旧的库连接,但真的希望现代SQL语义,你可能想要把它们变成ON。对于所有其他应用程序,这些选项很可能已经在每个会话的基础上由应用程序本身设置为正确的值,并且您配置的内容无论如何都无关紧要。

关于每个单个选项的讨论以及何时您想要将其变为ONOFF的讨论将超出合理答案的限制。查阅他们每个人的文档并制定自己的最佳做法。你可以让像SET option requirements for indexes on computed columns这样的东西引导你,在你创建它们之前需要大量的选项是ON(他们通常被认为是一件好事)。

+0

很好的答案。谢谢 –

相关问题