Anda perlu menempatkan sqlservr.exe.config file di \Binn folder folder root instance itu. Misalnya:
C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Binn
Jika Anda menggunakan SQL Server 2008 R2 (SP1) atau yang lebih baru, Anda seharusnya dapat menemukan lokasi yang tepat melalui kueri berikut, yang menunjukkan jalur lengkap ke sqlservr.exe :
SELECT [filename] FROM sys.dm_server_services WHERE servicename LIKE N'SQL Server (%';
Dalam kode Anda, Anda memerlukan baris ini di bagian atas:
using System.Configuration;
Dan ini akan berhasil:
[SqlFunction(DataAccess = DataAccessKind.None, IsDeterministic = true)]
public static SqlString GetConfig(SqlString WhichOne)
{
ConfigurationManager.RefreshSection("connectionStrings");
return ConfigurationManager.ConnectionStrings[WhichOne.Value].ToString();
}
Isi sqlservr.exe.config berkas:
<?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>
Penting untuk dicatat bahwa, sebagaimana dinyatakan dalam tautan "Menggunakan Konfigurasi Aplikasi...", perubahan yang dibuat pada file konfigurasi tidak segera tersedia. NAMUN , Anda tidak perlu memaksa memuat ulang dengan melakukan salah satu metode yang disebutkan dalam artikel itu (yaitu DBCC FREESYSTEMCACHE
, dan memulai ulang SQL Server). Semua yang diperlukan untuk mendapatkan informasi terkini adalah memuat ulang bagian tertentu yang Anda gunakan melalui ConfigurationManager.RefreshSection(string sectionName) seperti yang ditunjukkan pada contoh di atas. Silakan lihat catatan di bawah tentang penggunaan dan kinerja.
Sumber daya:
- Menggunakan System.Configuration.dll di .NET sprocs dan UDF
- Menggunakan File Konfigurasi Aplikasi (app.config/web.config) dalam Integrasi SQL Server CLR
Selain itu, kecuali Anda benar-benar perlu, Anda tidak boleh membuat Majelis sebagai UNSAFE
. Jika Anda hanya mencoba membuat koneksi TCP ke mesin lain, itu hanya memerlukan EXTERNAL_ACCESS
.
PENGGUNAAN DAN KINERJA
Seperti yang disarankan oleh Joe B dalam komentar di bawah, ada sedikit peningkatan kinerja untuk RefreshSection
operasi. Jika kode yang berisi penyegaran akan dipanggil lebih dari sekali setiap beberapa menit, maka itu dapat memiliki dampak yang nyata (dampak yang tidak perlu mengingat kurangnya frekuensi perubahan file konfigurasi). Dalam hal ini, Anda ingin menghapus panggilan ke RefreshSection
dari kode yang sering dipanggil dan menangani penyegaran secara mandiri.
Salah satu pendekatan adalah memiliki Prosedur Tersimpan SQLCLR atau Fungsi Skalar yang hanya melakukan penyegaran dan tidak ada yang lain. Ini dapat dijalankan setiap kali ada perubahan pada file konfigurasi.
Pendekatan lain adalah dengan membongkar Domain Aplikasi yang akan memuat ulang file konfigurasi pada saat objek SQLCLR apa pun dalam basis data tersebut direferensikan. Salah satu metode yang cukup sederhana untuk memuat ulang semua Domain Aplikasi dalam Basis Data tertentu (tetapi tidak di seluruh Instans) adalah dengan membalik TRUSTWORTHY
pengaturan Hidup dan kemudian Mati lagi, atau Mati dan kemudian Hidup lagi, tergantung pada status pengaturan saat ini. Kode di bawah ini akan memeriksa status saat ini dari pengaturan itu dan membaliknya sesuai dengan itu:
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;
Tolong jangan gunakan metode yang lebih drastis -- DBCC FREESYSTEMCACHE
, nonaktifkan lalu aktifkan clr enabled
pengaturan sistem, memulai ulang Instans, dll -- karena hampir tidak pernah diperlukan untuk melakukannya. Terutama memulai ulang Instans, atau DBCC FREESYSTEMCACHE
yang menjatuhkan semua data cache untuk seluruh Instance, yang memengaruhi lebih dari sekadar SQLCLR.
PEMBARUAN TENTANG SQL SERVER DI LINUX
SQL Server sekarang, dimulai dengan versi 2017, tersedia di Linux (woo hoo!). Namun, sepertinya membaca dari file konfigurasi aplikasi tidak bekerja di Linux. Saya telah mencoba banyak kombinasi sqlservr.exe.[Cc]onfig
dan sqlservr.[Cc]onfig
, dll, dan sejenisnya dan belum mendapatkan apa pun untuk bekerja. Menentukan file konfigurasi tidak dapat berfungsi karena memerlukan EXTERNAL_ACCESS
izin dan hanya SAFE
Rakitan diizinkan di Linux (setidaknya untuk saat ini). Jika saya menemukan cara untuk membuatnya berfungsi, saya akan memposting detailnya di sini.