Sql 创建新数据库时的最佳ANSI选项
我正在为我们的生产环境在SQL Server 2012上创建一个新的数据库。当我使用SQL Server Management Studio中的“新建数据库…”选项并生成我得到的输出时:Sql 创建新数据库时的最佳ANSI选项,sql,sql-server,sql-server-2012,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
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代表我们设置的。可能是因为他们在实例中设置了一些默认值吗
谢谢,
Chris选项默认为
关闭
,因为很可能创建和编写此数据库时未触及任何默认值。创建数据库时,它基本上是从模型
系统数据库克隆而来的,在全新安装的SQL Server上,数据库上的ANSI设置将是关闭
,即使其中一些设置(如ANSI_NULLS
)对于任何现代数据库应用程序,这些选项都是您永远不希望关闭的。事实上,尤其是在ANSI_NULLS
的情况下,文档中明确指出,关闭它的能力是非常重要的,尽管可能还要过几年才会真正实现
这就是问题所在:为了旧应用程序的利益,这些设置仍然保持关闭
,旧应用程序必须打开这些选项才能从它们的优点(以及破坏性的更改)中获益。如果会话未为它们指定任何值,则应用数据库设置
但大多数应用程序都会在会话中指定这些设置,如果不是显式的,则会通过其数据访问库隐式地指定。根据上的文档,它可以一次切换一组设置:
SQL Server本机客户端ODBC驱动程序和SQL Server本机客户端
SQL Server的OLE DB提供程序会自动将ANSI_默认值设置为ON
连接时。然后设置驱动程序和提供程序
CURSOR\u CLOSE\u ON\u COMMIT
和IMPLICIT\u事务
toOFF
。关闭
提交时SET CURSOR\u CLOSE\u和SET IMPLICIT\u事务的设置
可以在ODBC数据源、ODBC连接属性、,
或在应用程序中设置的OLE DB连接属性中
在连接到SQL Server之前。设置ANSI_默认值的默认值为
OFF
用于数据库库应用程序的连接
DB Library是一个古老的access库,但仍被一些古老的应用程序使用,并且可以作为FreeTDS之类的备份源,因此您仍然可以偶尔遇到有意或无意使用数据库设置的应用程序,但这种情况越来越少
至于这些选项的最佳价值,这完全取决于您的用例。如果您必须支持期望旧行为的旧应用程序,则您可能没有选择必须将数据库设置保持为打开<代码>关闭代码>。如果您有一个通过旧库连接的应用程序,但它确实需要现代SQL语义,那么您可能需要启用它们。对于所有其他应用程序,这些选项可能已经由应用程序本身在每个会话的基础上设置为其(in)正确的值,并且您配置的内容也无关紧要
关于每个选项的讨论,以及您想何时打开或关闭的讨论,都会超出合理答案的限制。查阅每种方法的文档,并制定自己的最佳实践。你可以让像这样的东西来引导你,在你创建它们之前,需要有一堆选项(通常认为拥有它们是件好事)。好问题。这些设置本身就是一个主题。我认为在堆栈溢出的长度限制方面,没有人能给你一个很好的答案。如果有什么你关心的,我会分别询问(在谷歌搜索之后)。我看到的一件事是,您的日志文件设置为按百分比增长,如果您可以将其更改为固定数量,这可能是最好的。感谢@RichBenner提供有关自动按百分比增长的信息。最困扰我的设置是ANSI_NULLS
。标准告诉我,NULL=NULL
应该返回UNKNOWN
/NULL
(即当选项打开时)而不是TRUE
(当选项关闭时),但是默认值似乎是后者(关闭)该网站建议将其设置为OFF:@MisterPositive:我不太担心ANSI_NULL\u DEFAULT
,因为我总是明确声明我希望列为NULL还是不为NULL。这是ANSI_NULLS选项。原因很简单:向后兼容。对于大多数当前的应用程序,这并不重要。所有现代客户端库都会提供自己的默认值。例如,默认情况下,所有ODBC和ADO.NET应用程序都将ANSI_NULLS
指定为ON
。只有使用旧的dblib
之类的东西的古老应用程序才会将这些设置留给数据库,正是因为它们太旧了,所以有理由期望它们需要旧的行为。这就是为什么即使在现代版本的SQL Server上,默认情况下这些选项仍处于关闭状态,但它们基本上是不相关的。如果您确定没有连接旧的应用程序,您可以选择1)耸耸肩,期望现代库无论如何都能正确设置,或者2)即使是“坏”设置,也能获得最大的一致性应用程序碰巧偷袭到您身上,将这些选项设置为正常默认值,这样每个人都会得到相同的行为。需要明确的是:这只适用于ANSI设置;许多其他的设置没有自然的默认值,并且代表了一种方式并不比另一种方式好的真实特性。回答得很好。谢谢