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 代表我们设置的。可能是因为他们在实例中设置了一些默认值?
谢谢,克里斯
这些选项默认为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_DEFAULTS为ON。然后驱动程序和提供程序将CURSOR_CLOSE_ON_COMMIT和设置IMPLICIT_TRANSACTIONS为OFF。和 的OFF设置可以 在 ODBC 数据源、ODBC 连接属性或连接到 SQL Server 之前在应用程序中设置的 OLE DB 连接属性中进行配置。默认值用于 来自 DB-Library 应用程序的连接。SET CURSOR_CLOSE_ON_COMMITSET IMPLICIT_TRANSACTIONSSET ANSI_DEFAULTSOFF
DB-Library 是一个旧的访问库,但仍然被一些古老的应用程序使用,并且可以选择作为 FreeTDS 之类的后备源,因此您仍然经常会遇到有意或无意使用数据库设置的应用程序,但是这个越来越少见。
至于这些选项的最佳价值,这完全取决于您的用例。如果您必须支持期望旧行为的旧应用程序,则您可能别无选择,必须将数据库设置保留为打开状态OFF。如果您有一个通过旧库连接但确实需要现代 SQL 语义的应用程序,您可能需要将它们转换为ON. 对于所有其他应用程序,这些选项可能已经由应用程序本身在每个会话的基础上设置为正确(不)的值,并且您配置的内容无论如何都无关紧要。
对每个选项以及您何时想要改变它ON或OFF超出合理答案的限制进行讨论。请参阅每个文档的文档并制定您自己的最佳实践。您可以让诸如SET计算列索引的选项要求之类的内容来指导您,这需要一堆选项才能ON创建它们(并且通常认为拥有它们是一件好事)。