변화의 영향이 무엇인지 아무도 모르기 때문에 존재하는 몇 가지 기본값이 있습니다. 예를 들어 OS 언어로 "US English"를 사용하는 시스템에 설치할 때 기본 인스턴스 수준 데이터 정렬은 SQL_Latin1_General_CP1_CI_AS
입니다. SQL_*
데이터 정렬은 SQL Server 2000 이전 버전과의 호환성을위한 것이므로 의미가 없습니다 . SQL Server 2000부터는 실제로 Windows 데이터 정렬을 선택할 수 있으므로 미국 영어 시스템의 기본값 이로 변경 되어야 합니다 Latin1_General_CI_AS
. 그러나 Microsoft의 아무도 잠재적 인 다양한 하위 시스템 및 시스템 저장 프로 시저에 어떤 영향을 줄지 아무도 모른다고 생각합니다.
따라서 데이터베이스 기본값 또는 인스턴스 전체로 ON으로 설정하면 특정 부정적인 영향을 알지 못합니다. 동시에 테스트하지 않았습니다. 그러나 테스트 한 경우에도 응용 프로그램과 동일한 코드 경로를 사용하지 않을 수 있으므로 환경에서 실제로 테스트 해야하는 것입니다. 로 설정ON
개발자 및 QA 환경의 인스턴스 수준에서 한두 달 동안 어떻게 작동하는지 확인하십시오. 그런 다음 스테이징 / UAT에서 활성화하십시오. 몇 주 동안 모든 것이 계속 잘 진행되면 해당 구성 변경을 프로덕션으로 롤하십시오. 핵심은 매일 적중하지 않는 다양한 코드 경로를 테스트하는 데 가능한 한 많은 시간을 제공하는 것입니다. 일부는 매주 또는 몇 달 또는 매년 타격을받습니다. 일부 코드 경로는 지원 또는 몇 년 전에 누군가가 만든 적이없는 임의의 간격으로 만 사용되는 임시 보고서 또는 유지 관리 프로세스 만 지원합니다.
따라서 변경하지 않았으므로 여전히 기본 "사용자 옵션"설정이있는 인스턴스에서 테스트를 수행했습니다.
참고 :
@@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
및 하지 인스턴스 전체 설정을 변경하고 그것은 작동하지 않았다.