Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Unterstützt die SQL Server CLR-Integration Konfigurationsdateien?

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.