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 FREESYSTEMCACHE
、clr enabled
を無効にしてから有効にします システム設定、インスタンスの再起動など-そうする必要はほとんどないため。特にインスタンスの再起動、またはDBCC FREESYSTEMCACHE
すべてをドロップします インスタンス全体のキャッシュデータ。これは、SQLCLRだけでなく多くの影響を及ぼします。
Linux上のSQLサーバーに関する更新
SQL Serverは、バージョン2017以降、Linuxで利用できるようになりました(woo hoo!)。ただし、アプリの設定ファイルからの読み取りはではないようです。 Linuxで動作します。 sqlservr.exe.[Cc]onfig
の多くの組み合わせを試しました およびsqlservr.[Cc]onfig
、などなど、何も動作していません。 EXTERNAL_ACCESS
が必要なため、構成ファイルを指定することはできません。 許可とSAFE
のみ Linuxではアセンブリが許可されています(少なくとも現時点では)。それを機能させる方法を見つけたら、ここに詳細を投稿します。