sql >> Databasteknik >  >> RDS >> Sqlserver

Stöder SQL Server CLR Integration konfigurationsfiler?

Du måste placera en sqlservr.exe.config filen i \Binn mapp för den instansens rotmapp. Till exempel:

C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Binn

Om du använder SQL Server 2008 R2 (SP1) eller senare bör du kunna hitta den exakta platsen via följande fråga, som visar den fullständiga sökvägen till sqlservr.exe :

SELECT [filename] FROM sys.dm_server_services WHERE servicename LIKE N'SQL Server (%';

I din kod behöver du denna rad överst:

using System.Configuration;

Och då kommer detta att fungera:

[SqlFunction(DataAccess = DataAccessKind.None, IsDeterministic = true)]
public static SqlString GetConfig(SqlString WhichOne)
{
    ConfigurationManager.RefreshSection("connectionStrings");
    return ConfigurationManager.ConnectionStrings[WhichOne.Value].ToString();
}

Innehållet i 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 är viktigt att notera att, som anges i länken "Using an Application Configuration...", ändringar som görs i konfigurationsfilen inte är omedelbart tillgängliga. MEN , det gör du inte måste tvinga fram en omladdning genom att göra en av metoderna som nämns i den artikeln (t.ex. DBCC FREESYSTEMCACHE och starta om SQL Server). Allt som krävs för att få aktuell information är att ladda om det särskilda avsnittet du använder via ConfigurationManager.RefreshSection(sträng avsnittsnamn) som visas i exemplet ovan. Se notering nedan angående användning och prestanda.

Resurser:

  • Använda System.Configuration.dll i .NET sprocs och UDFs
  • Använda en applikationskonfigurationsfil (app.config/web.config) i SQL Server CLR-integration

Dessutom, om du inte absolut behöver, bör du inte skapa din sammansättning som UNSAFE . Om du bara försöker göra TCP-anslutningar till andra maskiner, bör det bara kräva EXTERNAL_ACCESS .

ANVÄNDNING OCH PRESTANDA

Som föreslagits av Joe B i en kommentar nedan, finns det en liten prestandaträff för RefreshSection drift. Om koden som innehåller uppdateringen kommer att anropas mer än en gång varannan minut, kan det ha en märkbar effekt (en inverkan som är onödig med tanke på bristen på frekvens av en konfigurationsfil som ändras). I det här fallet vill du ta bort anropet till RefreshSection från koden som anropas ofta och hantera uppdateringen oberoende.

Ett tillvägagångssätt skulle vara att ha en SQLCLR lagrad procedur eller skalär funktion som bara gör uppdateringen och inget annat. Detta kan utföras närhelst en ändring den gjorde i konfigurationsfilen.

Ett annat tillvägagångssätt skulle vara att ta bort appdomänen som laddar om konfigurationsfilen nästa gång något SQLCLR-objekt i den databasen refereras. En ganska enkel metod för att ladda om alla appdomäner i en viss databas (men inte över hela instansen) är att vända TRUSTWORTHY ställa in På och sedan Av igen, eller Av och sedan På igen, beroende på det aktuella läget för den inställningen. Koden nedan kommer att kontrollera det aktuella läget för den inställningen och vända den därefter:

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;

Snälla använd inte någon av de mer drastiska metoderna -- DBCC FREESYSTEMCACHE , inaktivera och sedan aktivera clr enabled systeminställning, omstart av instansen, etc -- eftersom det nästan aldrig är nödvändigt att göra det. Särskilt att starta om instansen, eller DBCC FREESYSTEMCACHE vilket tappar alla cachad data för hela instansen, vilket påverkar mycket mer än bara SQLCLR.

UPPDATERING AVSEENDE SQL SERVER PÅ LINUX

SQL Server är nu, från och med version 2017, tillgänglig på Linux (woo hoo!). Det verkar dock som att läsning från appens konfigurationsfil inte gör det arbeta på Linux. Jag har provat många kombinationer av sqlservr.exe.[Cc]onfig och sqlservr.[Cc]onfig , etc, och liknande och har inte fått något att fungera. Det går inte att ange en konfigurationsfil eftersom det kräver EXTERNAL_ACCESS behörighet och endast SAFE Sammansättningar är tillåtna på Linux (åtminstone just nu). Om jag hittar ett sätt att få det att fungera kommer jag att lägga upp detaljerna här.



  1. COALESCE-funktion i TSQL

  2. 5 MySql användbara frågor under projektutveckling

  3. Är det verkligen nödvändigt att skapa SQLite-tabeller varje gång programmet startar?

  4. SQL Server Backup Check