sql >> Database teknologi >  >> RDS >> Sqlserver

Understøtter SQL Server CLR Integration konfigurationsfiler?

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.



  1. DROP TABEL HVIS FINNES i SQLite

  2. Hvordan kan jeg rette MySQL fejl #1064?

  3. TO_CHAR(datotid) Funktion i Oracle

  4. Oracle-lagret procedure med parametre for IN-klausul