कुछ चूक हैं जो केवल इसलिए मौजूद हैं क्योंकि कोई भी वास्तव में नहीं जानता कि उन्हें बदलने का क्या प्रभाव होगा। उदाहरण के लिए, ओएस भाषा के रूप में "यूएस इंग्लिश" का उपयोग करने वाले सिस्टम पर इंस्टॉल करते समय डिफ़ॉल्ट इंस्टेंस-स्तर का टकराव होता है SQL_Latin1_General_CP1_CI_AS
। इससे कोई मतलब नहीं है क्योंकि SQL_*
टकराव पूर्व SQL Server 2000 संगतता के लिए हैं। SQL सर्वर 2000 में शुरू करने से आप वास्तव में एक विंडोज कोलाजेशन चुन सकते हैं, और इसलिए यूएस इंग्लिश सिस्टम के लिए डिफ़ॉल्ट को बदलना चाहिए था Latin1_General_CI_AS
। लेकिन, मुझे लगता है कि Microsoft में कोई भी वास्तव में नहीं जानता कि सभी संभावित उप-प्रणालियों और सिस्टम संग्रहीत प्रक्रियाओं, आदि पर क्या प्रभाव पड़ेगा।
इसलिए, मुझे डेटाबेस डिफ़ॉल्ट या यहां तक कि उदाहरण के रूप में इसे चालू करने के किसी भी विशिष्ट नकारात्मक प्रभाव के बारे में पता नहीं है। उसी समय, मैंने इसका परीक्षण नहीं किया है। लेकिन यहां तक कि अगर मैंने इसका परीक्षण किया था, तो मैं अभी भी आपके आवेदन के समान कोड पथ का उपयोग नहीं कर सकता हूं, इसलिए यह कुछ ऐसा है जिसे आपको वास्तव में अपने वातावरण में परीक्षण करने की आवश्यकता है। इसे सेट करेंON
अपने देव और क्यूए वातावरण में उदाहरण के स्तर पर और देखें कि यह एक या दो महीने तक कैसे काम करता है। फिर इसे स्टेजिंग / यूएटी में सक्षम करें। यदि सबकुछ कई हफ्तों तक जारी रहता है, तो उत्पादन में परिवर्तन को कॉन्फ़िगर करें। कुंजी विभिन्न कोड रास्तों के परीक्षण के लिए जितना संभव हो उतना समय देना है जो दैनिक हिट नहीं हैं। कुछ साप्ताहिक या महीने या सालाना हिट होते हैं। कुछ कोड पथ केवल समर्थन से हिट होते हैं, या कुछ तदर्थ रिपोर्ट या रखरखाव खरीदता है जो किसी ने सालों पहले बनाया था और कभी भी आपको इसके बारे में नहीं बताया और केवल यादृच्छिक अंतराल (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)
परिवर्तन प्रभाव कनेक्शन विकल्प:
निम्नलिखित टी-एसक्यूएल 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
और न बदलने के साथ एक सरल परीक्षण किया और यह काम नहीं किया।