Musíte umístit sqlservr.exe.config soubor v \Binn složku kořenové složky této instance. Například:
C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Binn
Pokud používáte SQL Server 2008 R2 (SP1) nebo novější, měli byste být schopni najít přesné umístění pomocí následujícího dotazu, který zobrazuje úplnou cestu k sqlservr.exe :
SELECT [filename] FROM sys.dm_server_services WHERE servicename LIKE N'SQL Server (%';
Ve svém kódu potřebujete tento řádek nahoře:
using System.Configuration;
A pak to bude fungovat:
[SqlFunction(DataAccess = DataAccessKind.None, IsDeterministic = true)]
public static SqlString GetConfig(SqlString WhichOne)
{
ConfigurationManager.RefreshSection("connectionStrings");
return ConfigurationManager.ConnectionStrings[WhichOne.Value].ToString();
}
Obsah souboru sqlservr.exe.config soubor:
<?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>
Je důležité si uvědomit, že jak je uvedeno v odkazu "Using an Application Configuration...", změny provedené v konfiguračním souboru nejsou okamžitě dostupné. VŠAK , ne potřeba vynutit opětovné načtení jednou z metod uvedených v tomto článku (tj. DBCC FREESYSTEMCACHE
a restartování SQL Serveru). Vše, co je potřeba k získání aktuálních informací, je znovu načíst konkrétní sekci, kterou používáte, pomocí ConfigurationManager.RefreshSection(string sectionName), jak je ukázáno v příkladu výše. Viz níže uvedená poznámka týkající se použití a výkonu.
Zdroje:
- Použití System.Configuration.dll v .NET sprocs a UDF
- Použití souboru konfigurace aplikace (app.config/web.config) v integraci SQL Server CLR
Pokud to nezbytně nepotřebujete, neměli byste sestavu vytvářet jako UNSAFE
. Pokud se právě pokoušíte vytvořit připojení TCP k jiným počítačům, mělo by to vyžadovat pouze EXTERNAL_ACCESS
.
VYUŽITÍ A VÝKON
Jak navrhl Joe B v komentáři níže, došlo k mírnému snížení výkonu pro RefreshSection
úkon. Pokud bude kód obsahující aktualizaci volán více než jednou za pár minut, může to mít znatelný dopad (dopad, který je zbytečný vzhledem k nedostatečné frekvenci změn konfiguračního souboru). V tomto případě budete chtít odstranit volání RefreshSection
z kódu, který je volán často, a zpracovat aktualizaci nezávisle.
Jedním přístupem by bylo mít uloženou proceduru SQLCLR nebo skalární funkci, která pouze provádí aktualizaci a nic jiného. To lze provést při každé změně v konfiguračním souboru.
Dalším přístupem by bylo uvolnit doménu aplikace, která znovu načte konfigurační soubor při příštím odkazu na jakýkoli objekt SQLCLR v této databázi. Jeden poměrně jednoduchý způsob, jak znovu načíst všechny domény aplikace v konkrétní databázi (ale ne v celé instanci), je překlopit TRUSTWORTHY
nastavení Zapnuto a poté znovu Vypnuto nebo Vypnuto a znovu Zapnuto v závislosti na aktuálním stavu tohoto nastavení. Níže uvedený kód zkontroluje aktuální stav tohoto nastavení a podle toho jej převrátí:
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;
Prosím nepoužívejte žádnou z drastičtějších metod -- DBCC FREESYSTEMCACHE
, deaktivací a poté povolením clr enabled
nastavení systému, restartování instance atd. – protože to není téměř nikdy nutné. Zejména restartování instance nebo DBCC FREESYSTEMCACHE
který zahodí vše uložená data pro celou instanci, což ovlivňuje mnohem víc než jen SQLCLR.
AKTUALIZACE TÝKAJÍCÍ SE SQL SERVERU V LINUXU
SQL Server je nyní počínaje verzí 2017 dostupný na Linuxu (woo hoo!). Zdá se však, že čtení z konfiguračního souboru aplikace ne pracovat na Linuxu. Vyzkoušel jsem mnoho kombinací sqlservr.exe.[Cc]onfig
a sqlservr.[Cc]onfig
atd. a podobně a nedostali nic do práce. Zadání konfiguračního souboru nemůže fungovat, protože vyžaduje EXTERNAL_ACCESS
oprávnění a pouze SAFE
Sestavení jsou na Linuxu povolena (alespoň od této chvíle). Pokud najdu způsob, jak to zprovoznit, zveřejním podrobnosti zde.