มีค่าเริ่มต้นบางอย่างที่มีอยู่เพียงเพราะไม่มีใครรู้ว่าผลของการเปลี่ยนพวกเขาจะเป็นอย่างไร ยกตัวอย่างเช่นการเริ่มต้นการเปรียบเทียบเช่นระดับเมื่อติดตั้งในระบบที่ใช้ "ภาษาอังกฤษ" เป็นภาษา OS SQL_Latin1_General_CP1_CI_AS
คือ สิ่งนี้ไม่สมเหตุสมผลเนื่องจากการSQL_*
เปรียบเทียบมีไว้สำหรับความเข้ากันได้ของ SQL Server 2000 เริ่มต้นใน SQL Server 2000 คุณจริงสามารถเลือกการเปรียบเทียบของ Windows และอื่น ๆ เริ่มต้นสำหรับระบบภาษาอังกฤษของสหรัฐอเมริกาควรจะLatin1_General_CI_AS
มีการเปลี่ยนแปลงไป แต่ฉันเดาว่าไม่มีใครใน Microsoft รู้จริง ๆ ว่าผลกระทบจะเป็นอย่างไรต่อระบบย่อยที่มีศักยภาพและกระบวนการจัดเก็บระบบ ฯลฯ
ดังนั้นฉันไม่ได้ตระหนักถึงผลกระทบเชิงลบใด ๆ ของการตั้งค่าเป็น ON ไม่ว่าจะเป็นค่าเริ่มต้นของฐานข้อมูลหรือแม้แต่อินสแตนซ์ ในขณะเดียวกันฉันยังไม่ได้ทดสอบ แต่แม้ว่าฉันได้ทำการทดสอบแล้วฉันอาจยังไม่ได้ใช้เส้นทางรหัสเดียวกันกับแอปพลิเคชันของคุณดังนั้นนี่คือสิ่งที่คุณจำเป็นต้องทดสอบในสภาพแวดล้อมของคุณ ตั้งเป็นON
ที่ระดับอินสแตนซ์ในสภาพแวดล้อม Dev และ QA ของคุณและดูว่ามันใช้งานได้หนึ่งหรือสองเดือน จากนั้นเปิดใช้งานใน Staging / UAT หากทุกอย่างยังคงดำเนินต่อไปได้ดีเป็นเวลาหลายสัปดาห์ให้เปลี่ยนการกำหนดค่าเป็นการผลิต กุญแจสำคัญคือการให้เวลามากที่สุดเท่าที่จะทำได้สำหรับการทดสอบพา ธ ของรหัสต่างๆที่ไม่ได้ตีทุกวัน บางคนถูกโจมตีทุกสัปดาห์หรือหลายเดือนหรือทุกปี เส้นทางโค้ดบางอย่างได้รับการสนับสนุนโดยเฉพาะหรือรายงานเฉพาะกิจหรือ proc การบำรุงรักษาที่ใครบางคนสร้างเมื่อหลายปีก่อนและไม่เคยบอกคุณเกี่ยวกับและจะได้รับการใช้งานในช่วงเวลาสุ่มเท่านั้น (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
และไม่เปลี่ยนการตั้งค่าทั้งอินสแตนซ์และดูเหมือนจะไม่ทำงาน