Sie müssen eine sqlservr.exe.config platzieren Datei im \Binn Ordner des Stammordners dieser Instanz. Zum Beispiel:
C:\Programme\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Binn
Wenn Sie SQL Server 2008 R2 (SP1) oder neuer verwenden, sollten Sie in der Lage sein, den genauen Speicherort über die folgende Abfrage zu finden, die den vollständigen Pfad zu sqlservr.exe anzeigt :
SELECT [filename] FROM sys.dm_server_services WHERE servicename LIKE N'SQL Server (%';
In Ihrem Code benötigen Sie diese Zeile ganz oben:
using System.Configuration;
Und dann funktioniert das:
[SqlFunction(DataAccess = DataAccessKind.None, IsDeterministic = true)]
public static SqlString GetConfig(SqlString WhichOne)
{
ConfigurationManager.RefreshSection("connectionStrings");
return ConfigurationManager.ConnectionStrings[WhichOne.Value].ToString();
}
Inhalt der sqlservr.exe.config Datei:
<?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>
Es ist wichtig zu beachten, dass, wie im Link "Anwendungskonfiguration verwenden..." angegeben, Änderungen an der Konfigurationsdatei nicht sofort verfügbar sind. JEDOCH , du nicht müssen Sie ein Neuladen erzwingen, indem Sie eine der in diesem Artikel erwähnten Methoden ausführen (z. B. DBCC FREESYSTEMCACHE
, und Neustart von SQL Server). Um aktuelle Informationen zu erhalten, müssen Sie lediglich den jeweiligen Abschnitt, den Sie verwenden, über ConfigurationManager.RefreshSection(string sectionName) neu laden, wie im obigen Beispiel gezeigt. Bitte beachten Sie den Hinweis unten bezüglich Nutzung und Leistung.
Ressourcen:
- System.Configuration.dll in .NET-Sprocs und -UDFs verwenden
- Verwenden einer Anwendungskonfigurationsdatei (app.config/web.config) in der SQL Server CLR-Integration
Außerdem sollten Sie Ihre Assembly nicht als UNSAFE
erstellen, es sei denn, dies ist unbedingt erforderlich . Wenn Sie nur versuchen, TCP-Verbindungen zu anderen Computern herzustellen, sollte dies nur EXTERNAL_ACCESS
erfordern .
NUTZUNG UND LEISTUNG
Wie von Joe B in einem Kommentar unten vorgeschlagen, gibt es einen leichten Leistungseinbruch für RefreshSection
Betrieb. Wenn der Code, der die Aktualisierung enthält, mehr als einmal alle paar Minuten aufgerufen wird, kann dies spürbare Auswirkungen haben (eine Auswirkung, die angesichts der geringen Änderungshäufigkeit einer Konfigurationsdatei unnötig ist). In diesem Fall sollten Sie den Aufruf von RefreshSection
entfernen aus dem Code, der häufig aufgerufen wird, und behandeln die Aktualisierung unabhängig.
Ein Ansatz wäre eine gespeicherte SQLCLR-Prozedur oder Skalarfunktion, die nur die Aktualisierung durchführt und sonst nichts. Dies kann immer dann ausgeführt werden, wenn eine Änderung an der Konfigurationsdatei vorgenommen wurde.
Ein anderer Ansatz wäre, die App-Domäne zu entladen, wodurch die Konfigurationsdatei neu geladen wird, wenn das nächste Mal auf ein SQLCLR-Objekt in dieser Datenbank verwiesen wird. Eine relativ einfache Methode zum Neuladen aller App-Domänen in einer bestimmten Datenbank (aber nicht in der gesamten Instanz) besteht darin, den TRUSTWORTHY
umzudrehen Einstellung Ein und dann wieder Aus oder Aus und dann wieder Ein, je nach aktuellem Status dieser Einstellung. Der folgende Code überprüft den aktuellen Status dieser Einstellung und ändert sie entsprechend:
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;
Bitte Verwenden Sie keine der drastischeren Methoden - DBCC FREESYSTEMCACHE
, deaktivieren und dann clr enabled
aktivieren Systemeinstellung, Neustart der Instanz usw. - da dies fast nie erforderlich ist. Insbesondere Neustart der Instanz oder DBCC FREESYSTEMCACHE
was alle fallen lässt zwischengespeicherte Daten für die gesamte Instanz, was viel mehr betrifft als nur SQLCLR.
UPDATE BEZÜGLICH SQL SERVER UNTER LINUX
SQL Server ist jetzt ab Version 2017 unter Linux verfügbar (woo hoo!). Es scheint jedoch, dass das Lesen aus der App-Konfigurationsdatei nicht funktioniert unter Linux arbeiten. Ich habe viele Kombinationen von sqlservr.exe.[Cc]onfig
ausprobiert und sqlservr.[Cc]onfig
, etc, und dergleichen und habe nichts zum Laufen bekommen. Die Angabe einer Konfigurationsdatei kann nicht funktionieren, da dies EXTERNAL_ACCESS
erfordert Erlaubnis und nur SAFE
Assemblies sind unter Linux erlaubt (zumindest jetzt). Wenn ich einen Weg finde, es zum Laufen zu bringen, werde ich die Details hier posten.