Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Apakah Integrasi SQL Server CLR mendukung file konfigurasi?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Menemukan Format Tanggal yang Digunakan untuk Bahasa Tertentu di SQL Server (T-SQL)

  2. Bagaimana saya bisa mendapatkan daftar nama elemen dari nilai XML di SQL Server

  3. Ganti spasi duplikat dengan satu spasi di T-SQL

  4. Kunci Asing ke beberapa tabel

  5. Menghapus nol di depan dari bidang dalam pernyataan SQL