我正在为我们的生产环境在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代表我们设置。可能是因为他们在实例中设置了一些默认值吗?
谢谢, 克里斯
答案 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_COMMIT
和IMPLICIT_TRANSACTIONS
到OFF
。OFF
SET CURSOR_CLOSE_ON_COMMIT
和SET IMPLICIT_TRANSACTIONS
的设置 可以在ODBC数据源中配置,在ODBC连接属性中, 或者在应用程序中设置的OLE DB连接属性中 在连接到SQL Server之前。SET ANSI_DEFAULTS
的默认值为OFF
用于DB-Library应用程序的连接。
DB-Library是一个旧的访问库,但仍然被一些古老的应用程序使用,并且可选地作为FreeTDS之类的东西的后备源,所以你经常会遇到故意或意外使用数据库设置的应用程序,但这种情况越来越少了。
对于这些选项的最佳值,这完全取决于您的用例。如果您必须支持期望旧行为的旧应用程序,则可能无法选择在OFF
上保留数据库设置。如果您有一个通过旧库连接但实际上需要现代SQL语义的应用程序,您可能需要将它们转为ON
。对于所有其他应用程序,这些选项可能已经在每个会话的基础上设置为应用程序本身的(正确)值,并且您配置的内容无论如何都无关紧要。
有关每个选项的讨论以及何时需要将其ON
或OFF
转换为合理答案的限制。请查阅每个文档,并制定您自己的最佳实践。您可以让SET ANSI_DEFAULTS
之类的东西引导您,这需要一堆选项ON
才能创建它们(而且它们通常被认为是一件好事)。