Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

क्या SQL सर्वर CLR एकीकरण कॉन्फ़िगरेशन फ़ाइलों का समर्थन करता है?

आपको एक sqlservr.exe.config place रखना होगा \Binn . में फ़ाइल करें उस उदाहरण के रूट फ़ोल्डर का फ़ोल्डर। उदाहरण के लिए:

C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Binn

यदि आप SQL Server 2008 R2 (SP1) या नए का उपयोग कर रहे हैं, तो आपको निम्न क्वेरी के माध्यम से सटीक स्थान खोजने में सक्षम होना चाहिए, जो sqlservr.exe का पूरा पथ दिखाता है। :

SELECT [filename] FROM sys.dm_server_services WHERE servicename LIKE N'SQL Server (%';

आपके कोड में, आपको सबसे ऊपर यह लाइन चाहिए:

using System.Configuration;

और फिर यह काम करेगा:

[SqlFunction(DataAccess = DataAccessKind.None, IsDeterministic = true)]
public static SqlString GetConfig(SqlString WhichOne)
{
    ConfigurationManager.RefreshSection("connectionStrings");
    return ConfigurationManager.ConnectionStrings[WhichOne.Value].ToString();
}

sqlservr.exe.config . की सामग्री फ़ाइल:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
   <connectionStrings>
      <add name="Stuff" connectionString="Trusted_Connection=true; Enlist=false;" />
      <add name="ClrTest" connectionString="boo hoo" />
   </connectionStrings>
</configuration>

यह ध्यान रखना महत्वपूर्ण है कि, जैसा कि "एप्लिकेशन कॉन्फ़िगरेशन का उपयोग करना ..." लिंक में कहा गया है, कॉन्फ़िगरेशन फ़ाइल में किए गए परिवर्तन तुरंत उपलब्ध नहीं हैं। हालांकि , आप नहीं करते हैं उस आलेख में वर्णित विधियों में से एक (यानी DBCC FREESYSTEMCACHE) को करके एक पुनः लोड करने के लिए बाध्य करने की आवश्यकता है , और SQL सर्वर को पुनरारंभ करना)। वर्तमान जानकारी प्राप्त करने के लिए केवल उस विशेष अनुभाग को पुनः लोड करना आवश्यक है जिसका उपयोग आप ConfigurationManager.RefreshSection(string sectionName) के माध्यम से कर रहे हैं जैसा कि ऊपर दिए गए उदाहरण में दिखाया गया है। कृपया उपयोग और प्रदर्शन के संबंध में नीचे नोट देखें।

संसाधन:

  • .NET sprocs और UDFs में System.Configuration.dll का उपयोग करना
  • एसक्यूएल सर्वर सीएलआर एकीकरण में एप्लिकेशन कॉन्फ़िगरेशन (app.config/web.config) फ़ाइल का उपयोग करना

साथ ही, जब तक आपको बिल्कुल आवश्यकता न हो, आपको अपनी असेंबली को UNSAFE . के रूप में नहीं बनाना चाहिए . यदि आप अन्य मशीनों से केवल TCP कनेक्शन बनाने का प्रयास कर रहे हैं, तो इसके लिए केवल EXTERNAL_ACCESS की आवश्यकता होगी ।

उपयोग और प्रदर्शन

जैसा कि नीचे एक टिप्पणी में जो बी द्वारा सुझाया गया है, RefreshSection के लिए थोड़ा सा प्रदर्शन हिट है कार्यवाही। यदि रिफ्रेश वाले कोड को हर दो मिनट में एक से अधिक बार कॉल किया जा रहा है, तो इसका ध्यान देने योग्य प्रभाव हो सकता है (एक ऐसा प्रभाव जो अनावश्यक है क्योंकि कॉन्फ़िगरेशन फ़ाइल बदलने की आवृत्ति की कमी है)। इस मामले में, आप RefreshSection . पर कॉल को हटाना चाहेंगे उस कोड से जिसे बार-बार बुलाया जाता है और स्वतंत्र रूप से रीफ्रेश को संभालता है।

एक दृष्टिकोण एक SQLCLR संग्रहीत प्रक्रिया या स्केलर फ़ंक्शन होना होगा जो केवल रीफ्रेश करता है और कुछ भी नहीं। जब भी कॉन्फिग फाइल में कोई बदलाव किया जाता है तो इसे निष्पादित किया जा सकता है।

एक और तरीका ऐप डोमेन को अनलोड करना होगा जो अगली बार उस डेटाबेस में किसी भी SQLCLR ऑब्जेक्ट को संदर्भित करने पर कॉन्फ़िगरेशन फ़ाइल को फिर से लोड करेगा। किसी विशेष डेटाबेस (लेकिन पूरे इंस्टेंस में नहीं) में सभी ऐप डोमेन को पुनः लोड करने के लिए एक काफी सरल तरीका है TRUSTWORTHY को फ़्लिप करना उस सेटिंग की वर्तमान स्थिति के आधार पर फिर से चालू और फिर बंद या फिर बंद और फिर चालू करना। नीचे दिया गया कोड उस सेटिंग की वर्तमान स्थिति की जांच करेगा और उसके अनुसार इसे फ़्लिप करेगा:

IF (EXISTS(
    SELECT  sd.*
    FROM    sys.databases sd
    WHERE   sd.[name] = DB_NAME() -- or N'name'
    AND     sd.[is_trustworthy_on] = 0
   ))
BEGIN
    PRINT 'Enabling then disabling TRUSTWORTHY...';
    ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
    ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
END;
ELSE
BEGIN
    PRINT 'Disabling then enabling TRUSTWORTHY...';
    ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
    ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
END;

कृपया अधिक कठोर तरीकों का प्रयोग न करें -- DBCC FREESYSTEMCACHE , अक्षम करने के बाद clr enabled . को सक्षम करना सिस्टम सेटिंग, इंस्टेंस को फिर से शुरू करना, आदि - क्योंकि ऐसा करना लगभग कभी भी आवश्यक नहीं होता है। विशेष रूप से इंस्टेंस को फिर से शुरू करना, या DBCC FREESYSTEMCACHE जो सब को छोड़ देता है संपूर्ण उदाहरण के लिए कैश्ड डेटा, जो केवल SQLCLR से कहीं अधिक प्रभावित करता है।

LINUX पर SQL सर्वर के बारे में अपडेट करें

SQL सर्वर अब, संस्करण 2017 से शुरू हो रहा है, जो Linux पर उपलब्ध है (वू हू!)। हालांकि, ऐसा लगता है कि ऐप कॉन्फ़िग फ़ाइल से पढ़ना नहीं है लिनक्स पर काम करें। मैंने sqlservr.exe.[Cc]onfig . के कई संयोजनों को आजमाया है और sqlservr.[Cc]onfig , आदि, और इसी तरह और काम करने के लिए कुछ भी नहीं मिला है। कॉन्फ़िगरेशन फ़ाइल निर्दिष्ट करना काम नहीं कर सकता क्योंकि इसके लिए EXTERNAL_ACCESS की आवश्यकता होती है अनुमति और केवल SAFE लिनक्स पर असेंबली की अनुमति है (अभी के रूप में, कम से कम)। अगर मुझे इसे काम करने का कोई तरीका मिल जाए तो मैं यहां विवरण पोस्ट करूंगा।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. सी # SQL सर्वर डेटा प्रकार के समतुल्य

  2. SQL सर्वर:संचार लिंक विफलता आवश्यक SSL (पैकेट प्राप्त करने में विफल)

  3. SQL सर्वर में डेटाटाइम बनाम डेटाटाइम 2:क्या अंतर है?

  4. अनपेक्षित चर प्रकार प्राप्त-नौकरी द्वारा लौटाया गया

  5. SQL सर्वर में कर्सर का उपयोग करना बुरा व्यवहार क्यों माना जाता है?