Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 创建新数据库时的最佳ANSI选项_Sql_Sql Server_Sql Server 2012 - Fatal编程技术网

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

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

我正在为我们的生产环境在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选项默认为关闭? 服务器实例是由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事务
to
OFF
关闭
提交时
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设置;许多其他的设置没有自然的默认值,并且代表了一种方式并不比另一种方式好的真实特性。回答得很好。谢谢