Có một số mặc định tồn tại chỉ vì không ai thực sự biết tác động của việc thay đổi chúng sẽ là gì. Ví dụ: đối chiếu mức cá thể mặc định khi cài đặt trên hệ thống sử dụng "Tiếng Anh Mỹ" làm ngôn ngữ HĐH SQL_Latin1_General_CP1_CI_AS
. Điều này không có ý nghĩa gì vì các bộ SQL_*
sưu tập dành cho khả năng tương thích trước SQL Server 2000. Bắt đầu từ SQL Server 2000 bạn thực sự có thể chọn một collation Windows, và vì vậy mặc định cho hệ thống tiếng Anh Mỹ nên đã được thay đổi để Latin1_General_CI_AS
. NHƯNG, tôi đoán không ai ở Microsoft thực sự biết tác động sẽ ra sao đối với tất cả các hệ thống phụ và quy trình lưu trữ hệ thống tiềm năng khác nhau, v.v.
Vì vậy, tôi không nhận thức được bất kỳ tác động tiêu cực cụ thể nào của việc đặt nó thành BẬT làm cơ sở dữ liệu mặc định hoặc thậm chí toàn thể hiện. Đồng thời, tôi đã không kiểm tra nó. Nhưng ngay cả khi tôi đã kiểm tra nó, tôi vẫn có thể không sử dụng các đường dẫn mã giống như ứng dụng của bạn, vì vậy đây là thứ mà bạn thực sự cần kiểm tra trong môi trường của mình. Đặt nó thànhON
ở cấp độ cá thể trong môi trường Dev và QA của bạn và xem cách nó hoạt động trong một hoặc hai tháng. Sau đó kích hoạt nó trong Staging / UAT. Nếu tất cả tiếp tục diễn ra tốt đẹp trong vài tuần, hãy thay đổi cấu hình đó thành Sản xuất. Điều quan trọng là cung cấp càng nhiều thời gian càng tốt để kiểm tra các đường dẫn mã khác nhau không bị tấn công hàng ngày. Một số được đánh hàng tuần hoặc hàng tháng hoặc hàng năm. Một số đường dẫn mã chỉ được hỗ trợ, hoặc một số báo cáo đột xuất hoặc bảo trì mà ai đó đã tạo ra cách đây nhiều năm và không bao giờ nói với bạn về và chỉ được sử dụng trong các khoảng thời gian ngẫu nhiên (nah, điều đó không bao giờ xảy ra ;-).
Vì vậy, tôi đã thực hiện một số thử nghiệm trên một phiên bản vẫn có cài đặt "tùy chọn người dùng" mặc định vì tôi chưa bao giờ thay đổi nó.
Xin lưu ý:
@@OPTIONS
/ 'user options'
là một giá trị bitmasked
- 64 là bit cho
ARITHABORT ON
THIẾT LẬP
Tôi đã thử nghiệm với cả SQLCMD (sử dụng ODBC) và LINQPad (sử dụng .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 .
( ^
ký tự tiếp tục dòng DOS; .
trên dòng cuối cùng chỉ là buộc dòng phụ để dễ sao chép và dán hơn)
Trong 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());
}
}
KIỂM TRA 1: Trước
Trả về SQLCMD:
master: 0 (ODBC)
LINQPad trả về:
tempdb: 0 (.Net SqlClient Data Provider)
THAY ĐỔI TÙY CHỌN LIÊN KẾT:
T-SQL sau đây cho phép ARITHABORT
mà không xóa bất kỳ tùy chọn nào khác có thể được đặt và không thay đổi bất cứ điều gì nếu ARITHABORT
đã được đặt trong giá trị bitmasked.
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;
KIỂM TRA 2: Sau
Trả về SQLCMD:
master: 64 (ODBC)
LINQPad trả về:
tempdb: 64 (.Net SqlClient Data Provider)
Phần kết luận
Cho rằng:
- Dường như không có bất kỳ lợi ích nào khi có
ARITHABORT OFF
- Có lợi ích khi có
ARITHABORT ON
- Cài đặt kết nối mặc định (trừ khi bị ghi đè bởi kết nối) =
OFF
- Dường như ODBC hoặc OLEDB / .NET SqlClient cố gắng đặt
ARITHABORT
, do đó họ chấp nhận cài đặt mặc định
Tôi sẽ đề nghị thay đổi các tùy chọn kết nối mặc định trên toàn thể hiện (như được hiển thị ở trên). Điều này sẽ ít gây khó chịu hơn so với việc cập nhật ứng dụng. Tôi sẽ chỉ cập nhật ứng dụng nếu bạn thấy có vấn đề với việc thay đổi cài đặt toàn thể hiện.
PS Tôi đã thực hiện một thử nghiệm đơn giản với việc thay đổi tempdb
và không thay đổi cài đặt toàn thể hiện và nó dường như không hoạt động.