存在一些默认值仅仅是因为没有人真正知道更改它们的后果。例如,在使用“美国英语”作为操作系统语言的系统上安装时,默认的实例级排序规则为SQL_Latin1_General_CP1_CI_AS
。这是没有意义的,因为SQL_*
归类是针对SQL Server 2000以前的兼容性。从SQL Server 2000开始,您实际上可以选择Windows排序规则,因此,美国英语系统的默认设置应该已更改为Latin1_General_CI_AS
。但是,我想微软没有人真正知道会对所有各种潜在子系统和系统存储过程等产生什么影响。
因此,我不知道将其设置为数据库默认值或实例范围内的任何特定的负面影响。同时,我尚未对其进行测试。但是,即使我已经对其进行了测试,我仍可能不会使用与您的应用程序相同的代码路径,因此您确实需要在环境中对其进行测试。设置为ON
在您的开发和质量检查环境中的实例级别上,并观察它在一两个月内如何工作。然后在暂存/ UAT中启用它。如果在数周内一切正常,将配置更改滚动到“生产”。关键是要给尽可能多的时间来测试每天都不会遇到的各种代码路径。有些是每周,每月或每年受到打击。某些代码路径只会受到支持,或者某些人几年前创建并从未告诉过您的临时报告或维护过程,只会被随机使用(nah,这永远不会发生;-)。
因此,我对仍具有默认“用户选项”设置的实例进行了一些测试,因为我从未更改过它。
请注意:
@@OPTIONS
/ 'user options'
是位掩码值
- 64位
ARITHABORT ON
设定
我对SQLCMD(使用ODBC)和LINQPad(使用.NET SqlClient)进行了测试:
SQLCMD -W -S (local) ^
-Q"SELECT CONCAT(DB_NAME(), N': ', @@OPTIONS & 64, N' (', ses.[client_interface_name], N')') FROM sys.dm_exec_sessions ses WHERE ses.[session_id] = @@SPID;"
echo .
(这^
是DOS行的延续字符;.
最后一行的仅仅是为了强制多余的行,以便于复制和粘贴)
在LINQPad中:
using (SqlConnection connection =
new SqlConnection(@"Server=(local);Trusted_Connection=true;Database=tempdb;"))
{
using (SqlCommand command = connection.CreateCommand())
{
command.CommandText = @"SELECT @RetVal =
CONCAT(DB_NAME(), N': ', @@OPTIONS & 64, N' (', ses.[client_interface_name], N')')
FROM sys.dm_exec_sessions ses
WHERE ses.[session_id] = @@SPID;";
SqlParameter paramRetVal = new SqlParameter("@RetVal", SqlDbType.NVarChar, 500);
paramRetVal.Direction = ParameterDirection.Output;
command.Parameters.Add(paramRetVal);
connection.Open();
command.ExecuteNonQuery();
Console.WriteLine(paramRetVal.Value.ToString());
}
}
测试1:之前
SQLCMD返回:
master: 0 (ODBC)
LINQPad返回:
tempdb: 0 (.Net SqlClient Data Provider)
更改默认连接选项:
以下T-SQL启用时ARITHABORT
不会删除可能设置的任何其他选项,并且如果ARITHABORT
已在位掩码值中设置任何内容,则不会更改任何内容。
DECLARE @UserOptions INT;
-- Get current bitmasked value and ensure ARITHABORT is enabled:
SELECT @UserOptions = CONVERT(INT, cnf.[value_in_use]) | 64 -- enable "ARITHABORT"
FROM sys.configurations cnf
WHERE cnf.[configuration_id] = 1534 -- user options
-- Apply new default connection options:
EXEC sys.sp_configure N'user options', @UserOptions;
RECONFIGURE;
测试2:之后
SQLCMD返回:
master: 64 (ODBC)
LINQPad返回:
tempdb: 64 (.Net SqlClient Data Provider)
结论
鉴于:
- 拥有似乎没有任何好处
ARITHABORT OFF
- 有好处
ARITHABORT ON
- 默认连接设置(除非被连接覆盖)=
OFF
- 似乎没有ODBC或OLEDB / .NET SqlClient尝试设置
ARITHABORT
,因此它们接受默认设置
我建议更改实例范围的默认连接选项(如上所示)。与更新应用程序相比,这不会那么麻烦。仅当您发现更改实例范围的设置有问题时,我才会更新应用程序。
PS我做了一个简单的测试,更改tempdb
和不更改实例范围的设置,它似乎不起作用。