Sqlserver
 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), както е показано в примера по-горе. Моля, вижте бележката по-долу относно употребата и производителността.

Ресурси:

  • Използване на System.Configuration.dll в .NET sprocs и UDFs
  • Използване на файл с конфигурация на приложение (app.config/web.config) в SQL Server CLR интеграция

Освен това, освен ако не е абсолютно необходимо, не трябва да създавате своя сбор като UNSAFE . Ако просто се опитвате да направите TCP връзки с други машини, това трябва да изисква само EXTERNAL_ACCESS .

ИЗПОЛЗВАНЕ И ИЗПЪЛНЕНИЕ

Както беше предложено от Joe B в коментар по-долу, има лек удар в производителността за RefreshSection операция. Ако кодът, съдържащ опресняването, ще бъде извикан повече от веднъж на всеки няколко минути, тогава това може да има забележимо въздействие (въздействие, което е ненужно предвид липсата на честота на промяна на конфигурационния файл). В този случай ще искате да премахнете извикването към RefreshSection от кода, който се извиква често и обработват опресняването независимо.

Един подход би бил да имате SQLCLR Съхранена процедура или скаларна функция, която просто прави опресняване и нищо друго. Това може да се изпълни всеки път, когато е направена промяна в конфигурационния файл.

Друг подход би бил да се разтовари App Domain, който ще презареди конфигурационния файл при следващото препращане към всеки 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.

АКТУАЛИЗИРАНЕ ОТНОСНО SQL СЪРВЪР НА LINUX

SQL Server вече е наличен, като се започне с версия 2017, на Linux (уу!). Изглежда обаче, че четенето от конфигурационния файл на приложението не работа на Linux. Опитах много комбинации от sqlservr.exe.[Cc]onfig и sqlservr.[Cc]onfig и т.н. и други подобни и не са получили нищо да работи. Посочването на конфигурационен файл не може да работи, тъй като това изисква EXTERNAL_ACCESS разрешение и само SAFE Асембирането е разрешено в Linux (поне към момента). Ако намеря начин да го накарам да работи, ще публикувам подробностите тук.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как мога да получа сумата от множество стойности за дата и час?

  2. Възможно ли е да се изпълни текстов файл от SQL заявка?

  3. Как работи функцията CHARINDEX() в SQL Server (T-SQL)

  4. Вземете списък с бази данни от SQL Server

  5. Как да зададете цвета на лентата на състоянието в SSMS за различни екземпляри на SQL сървър - SQL Server / TSQL урок, част 6