sql >> データベース >  >> RDS >> Sqlserver

SQL Server CLR統合は構成ファイルをサポートしていますか?

    sqlservr.exe.configを配置する必要があります \ 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 Serverの再起動)。現在の情報を取得するために必要なのは、上記の例に示すように、ConfigurationManager.RefreshSection(string sectionName)を介して使用している特定のセクションをリロードすることだけです。 使用法とパフォーマンスについては、以下の注をご覧ください。

    リソース:

    • .NETsprocおよびUDFでのSystem.Configuration.dllの使用
    • SQL Server CLR統合でのアプリケーション構成(app.config / web.config)ファイルの使用

    また、どうしても必要な場合を除いて、アセンブリをUNSAFEとして作成しないでください。 。他のマシンへのTCP接続を確立しようとしているだけの場合は、EXTERNAL_ACCESSのみが必要です。 。

    使用法とパフォーマンス

    以下のコメントでJoeBが示唆しているように、RefreshSectionのパフォーマンスがわずかに低下しています。 手術。更新を含むコードが数分ごとに複数回呼び出される場合、それは顕著な影響を与える可能性があります(構成ファイルが変更される頻度がないため、影響は不要です)。この場合、RefreshSectionの呼び出しを削除する必要があります 頻繁に呼び出され、更新を個別に処理するコードから。

    1つのアプローチは、リフレッシュのみを実行し、他には何も実行しないSQLCLRストアドプロシージャまたはスカラー関数を使用することです。これは、構成ファイルに変更を加えるたびに実行できます。

    もう1つのアプローチは、App Domainをアンロードすることです。これにより、次にそのデータベース内のSQLCLRオブジェクトが参照されたときに、構成ファイルが再ロードされます。特定のデータベース内のすべてのアプリドメインを(インスタンス全体ではなく)リロードする非常に簡単な方法の1つは、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 FREESYSTEMCACHEclr enabledを無効にしてから有効にします システム設定、インスタンスの再起動など-そうする必要はほとんどないため。特にインスタンスの再起動、またはDBCC FREESYSTEMCACHE すべてをドロップします インスタンス全体のキャッシュデータ。これは、SQLCLRだけでなく多くの影響を及ぼします。

    Linux上のSQLサーバーに関する更新

    SQL Serverは、バージョン2017以降、Linuxで利用できるようになりました(woo hoo!)。ただし、アプリの設定ファイルからの読み取りはではないようです。 Linuxで動作します。 sqlservr.exe.[Cc]onfigの多くの組み合わせを試しました およびsqlservr.[Cc]onfig 、などなど、何も動作していません。 EXTERNAL_ACCESSが必要なため、構成ファイルを指定することはできません。 許可とSAFEのみ Linuxではアセンブリが許可されています(少なくとも現時点では)。それを機能させる方法を見つけたら、ここに詳細を投稿します。



    1. SQLServerで一重引用符をエスケープする

    2. T-SQLを使用してSQLServerでデータベース名を変更する方法

    3. HTMLメールに画像を埋め込む

    4. SQL Server:テーブルの最大行数