Ada beberapa default yang ada hanya karena tidak ada yang benar-benar tahu apa efek mengubahnya. Misalnya, susunan level instance default ketika menginstal pada sistem yang menggunakan "Bahasa Inggris AS" sebagai bahasa OS SQL_Latin1_General_CP1_CI_AS
. Ini tidak masuk akal karena SQL_*
pemeriksaan untuk kompatibilitas pra-SQL Server 2000. Mulai di SQL Server 2000 Anda benar-benar dapat memilih Windows collation, dan default untuk sistem bahasa Inggris AS seharusnya diubah menjadi Latin1_General_CI_AS
. TETAPI, saya kira tidak ada seorang pun di Microsoft yang benar-benar tahu apa dampaknya bagi semua sub-sistem potensial dan prosedur tersimpan sistem, dll.
Jadi, saya tidak mengetahui adanya dampak negatif spesifik dari pengaturan ke ON baik sebagai default database atau bahkan instance-wide. Pada saat yang sama, saya belum mengujinya. Tetapi bahkan jika saya telah mengujinya, saya mungkin masih tidak menggunakan jalur kode yang sama dengan aplikasi Anda, jadi ini adalah sesuatu yang benar-benar perlu Anda uji di lingkungan Anda. Setel keON
pada tingkat contoh di lingkungan Dev dan QA Anda dan lihat cara kerjanya selama satu atau dua bulan. Kemudian aktifkan di Staging / UAT. Jika semua terus berjalan dengan baik selama beberapa minggu, gulung perubahan konfigurasi itu ke Produksi. Kuncinya adalah memberi waktu sebanyak mungkin untuk menguji berbagai jalur kode yang tidak mengenai setiap hari. Beberapa hit mingguan atau bulan atau tahunan. Beberapa jalur kode hanya dihantam oleh dukungan, atau beberapa laporan ad hoc atau pemeliharaan yang dibuat seseorang bertahun-tahun yang lalu dan tidak pernah memberi tahu Anda tentang dan hanya digunakan secara berkala (nah, itu tidak pernah terjadi ;-).
Jadi, saya melakukan beberapa pengujian pada contoh yang masih memiliki pengaturan "opsi pengguna" default karena saya tidak pernah mengubahnya.
Tolong dicatat:
@@OPTIONS
/ 'user options'
adalah nilai bitmasked
- 64 adalah bit untuk
ARITHABORT ON
MEMPERSIAPKAN
Saya diuji dengan SQLCMD (yang menggunakan ODBC) dan LINQPad (yang menggunakan .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 .
( ^
ini adalah karakter kelanjutan garis DOS; .
baris terakhir hanya untuk memaksa garis tambahan agar lebih mudah untuk menyalin dan menempel)
Di 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());
}
}
UJI 1: Sebelumnya
SQLCMD kembali:
master: 0 (ODBC)
LINQPad kembali:
tempdb: 0 (.Net SqlClient Data Provider)
MENGUBAH OPSI KONEKSI DEFAULT:
T-SQL berikut ini memungkinkan ARITHABORT
tanpa menghapus opsi lain yang mungkin diatur, dan tanpa mengubah apa pun jika ARITHABORT
sudah ditetapkan dalam nilai 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;
UJI 2: Setelah
SQLCMD kembali:
master: 64 (ODBC)
LINQPad kembali:
tempdb: 64 (.Net SqlClient Data Provider)
Kesimpulan
Mengingat bahwa:
- Tampaknya tidak ada manfaatnya memiliki
ARITHABORT OFF
- Ada untungnya memiliki
ARITHABORT ON
- Pengaturan koneksi default (kecuali diganti oleh koneksi) =
OFF
- Tampaknya ODBC atau OLEDB / .NET SqlClient tidak mencoba untuk mengatur
ARITHABORT
, sehingga mereka menerima pengaturan default
Saya akan menyarankan mengubah opsi koneksi standar instans-lebar (seperti yang ditunjukkan di atas). Ini akan kurang menonjol daripada memperbarui aplikasi. Saya hanya akan memperbarui aplikasi jika Anda menemukan masalah dengan mengubah pengaturan lebar-instance.
PS Saya melakukan tes sederhana dengan mengubah tempdb
dan tidak mengubah pengaturan lebar-instance dan sepertinya tidak berhasil.