Du skal placere en sqlservr.exe.config fil i \Binn mappe i den instanss rodmappe. For eksempel:
C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Binn
Hvis du bruger SQL Server 2008 R2 (SP1) eller nyere, bør du være i stand til at finde den nøjagtige placering via følgende forespørgsel, som viser den fulde sti til sqlservr.exe :
SELECT [filename] FROM sys.dm_server_services WHERE servicename LIKE N'SQL Server (%';
I din kode skal du bruge denne linje øverst:
using System.Configuration;
Og så vil dette virke:
[SqlFunction(DataAccess = DataAccessKind.None, IsDeterministic = true)]
public static SqlString GetConfig(SqlString WhichOne)
{
ConfigurationManager.RefreshSection("connectionStrings");
return ConfigurationManager.ConnectionStrings[WhichOne.Value].ToString();
}
Indholdet af sqlservr.exe.config fil:
<?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>
Det er vigtigt at bemærke, at som angivet i linket "Brug af en applikationskonfiguration..." er ændringer foretaget i konfigurationsfilen ikke umiddelbart tilgængelige. DOG , det gør du ikke nødt til at tvinge en genindlæsning ved at udføre en af metoderne nævnt i den artikel (dvs. DBCC FREESYSTEMCACHE
, og genstart af SQL Server). Alt, der kræves for at få aktuelle oplysninger, er at genindlæse den særlige sektion, du bruger, via ConfigurationManager.RefreshSection(string sectionName) som vist i eksemplet ovenfor. Se venligst bemærkning nedenfor vedrørende brug og ydeevne.
Ressourcer:
- Brug af System.Configuration.dll i .NET sprocs og UDF'er
- Brug af en applikationskonfigurationsfil (app.config/web.config) i SQL Server CLR-integration
Medmindre du absolut har brug for det, bør du heller ikke oprette din samling som UNSAFE
. Hvis du bare prøver at oprette TCP-forbindelser til andre maskiner, burde det kun kræve EXTERNAL_ACCESS
.
BRUG OG YDELSE
Som foreslået af Joe B i en kommentar nedenfor, er der et lille præstationshit for RefreshSection
operation. Hvis koden, der indeholder opdateringen, bliver kaldt mere end én gang hvert par minutter, kan det have en mærkbar indvirkning (en påvirkning, der er unødvendig i betragtning af den manglende hyppighed af en konfigurationsfil, der ændrer sig). I dette tilfælde vil du gerne fjerne opkaldet til RefreshSection
fra den kode, der kaldes ofte og håndtere opdateringen uafhængigt.
En tilgang ville være at have en SQLCLR Stored Procedure eller Scalar Function, der bare foretager opdateringen og intet andet. Dette kan udføres, hver gang der er foretaget en ændring i konfigurationsfilen.
En anden fremgangsmåde ville være at fjerne appdomænet, som genindlæser konfigurationsfilen, næste gang der refereres til et SQLCLR-objekt i databasen. En ret simpel metode til at genindlæse alle appdomæner i en bestemt database (men ikke på tværs af hele instansen) er at vende TRUSTWORTHY
indstilling Til og derefter Fra igen, eller Fra og derefter Til igen, afhængigt af den aktuelle tilstand for denne indstilling. Koden nedenfor vil kontrollere den aktuelle tilstand for denne indstilling og vende den i overensstemmelse hermed:
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;
Venligst brug ikke nogen af de mere drastiske metoder -- DBCC FREESYSTEMCACHE
, deaktiverer derefter clr enabled
systemindstilling, genstart af instansen osv. -- da det næsten aldrig er nødvendigt at gøre det. Især genstart af forekomsten eller DBCC FREESYSTEMCACHE
hvilket taber alle cachelagrede data for hele forekomsten, hvilket påvirker meget mere end blot SQLCLR.
OPDATERING VEDRØRENDE SQL SERVER PÅ LINUX
SQL Server er nu, startende med version 2017, tilgængelig på Linux (woo hoo!). Det ser dog ud til, at læsning fra app-konfigurationsfilen ikke gør arbejde på Linux. Jeg har prøvet mange kombinationer af sqlservr.exe.[Cc]onfig
og sqlservr.[Cc]onfig
osv. og lignende og har ikke fået noget til at virke. Angivelse af en konfigurationsfil kan ikke fungere, da det kræver EXTERNAL_ACCESS
tilladelse og kun SAFE
Forsamlinger er tilladt på Linux (i det mindste lige nu). Hvis jeg finder en måde at få det til at virke, vil jeg poste detaljerne her.