sql >> Base de Datos >  >> RDS >> Sqlserver

¿La integración CLR de SQL Server admite archivos de configuración?

Debe colocar un sqlservr.exe.config archivo en el \Binn carpeta de la carpeta raíz de esa instancia. Por ejemplo:

C:\Archivos de programa\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Binn

Si está utilizando SQL Server 2008 R2 (SP1) o posterior, debería poder encontrar la ubicación exacta a través de la siguiente consulta, que muestra la ruta completa a sqlservr.exe :

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

En su código, necesita esta línea en la parte superior:

using System.Configuration;

Y entonces esto funcionará:

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

Contenido de sqlservr.exe.config archivo:

<?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 importante tener en cuenta que, como se indica en el enlace "Uso de una configuración de aplicación...", los cambios realizados en el archivo de configuración no están disponibles de inmediato. SIN EMBARGO , usted no necesita forzar una recarga haciendo uno de los métodos mencionados en ese artículo (es decir, DBCC FREESYSTEMCACHE y reiniciar SQL Server). Todo lo que se requiere para obtener la información actual es volver a cargar la sección particular que está usando a través de ConfigurationManager.RefreshSection(string sectionName) como se muestra en el ejemplo anterior. Consulte la nota a continuación sobre el uso y el rendimiento.

Recursos:

  • Uso de System.Configuration.dll en .NET sprocs y UDFs
  • Uso de un archivo de configuración de la aplicación (app.config/web.config) en la integración CLR de SQL Server

Además, a menos que sea absolutamente necesario, no debe crear su ensamblaje como UNSAFE . Si solo está tratando de hacer conexiones TCP a otras máquinas, eso solo debería requerir EXTERNAL_ACCESS .

USO Y RENDIMIENTO

Como sugirió Joe B en un comentario a continuación, hay un ligero impacto en el rendimiento de RefreshSection operación. Si el código que contiene la actualización se llamará más de una vez cada dos minutos, entonces puede tener un impacto notable (un impacto que es innecesario dada la falta de frecuencia de cambio de un archivo de configuración). En este caso, querrá eliminar la llamada a RefreshSection desde el código que se llama con frecuencia y manejar la actualización de forma independiente.

Un enfoque sería tener un procedimiento almacenado SQLCLR o una función escalar que solo actualice y nada más. Esto se puede ejecutar cada vez que se realiza un cambio en el archivo de configuración.

Otro enfoque sería descargar el dominio de la aplicación, que volverá a cargar el archivo de configuración la próxima vez que se haga referencia a cualquier objeto SQLCLR en esa base de datos. Un método bastante simple para recargar todos los dominios de la aplicación en una base de datos en particular (pero no en toda la instancia) es voltear el TRUSTWORTHY ajuste Activado y luego Desactivado de nuevo, o Desactivado y luego Activado de nuevo, dependiendo del estado actual de ese ajuste. El siguiente código verificará el estado actual de esa configuración y la cambiará en consecuencia:

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;

Por favor no use ninguno de los métodos más drásticos -- DBCC FREESYSTEMCACHE , deshabilitando y luego habilitando el clr enabled configuración del sistema, reinicio de la Instancia, etc., ya que casi nunca es necesario hacerlo. Especialmente reiniciando la Instancia, o DBCC FREESYSTEMCACHE que cae todo datos almacenados en caché para toda la Instancia, lo que afecta mucho más que solo SQLCLR.

ACTUALIZACIÓN SOBRE EL SERVIDOR SQL EN LINUX

SQL Server ahora, a partir de la versión 2017, está disponible en Linux (¡woo hoo!). Sin embargo, parece que la lectura del archivo de configuración de la aplicación no trabajar en Linux. He probado muchas combinaciones de sqlservr.exe.[Cc]onfig y sqlservr.[Cc]onfig , etc, y similares y no he conseguido que nada funcione. Especificar un archivo de configuración no puede funcionar ya que requiere EXTERNAL_ACCESS permiso y solo SAFE Los ensamblajes están permitidos en Linux (a partir de ahora, al menos). Si encuentro una forma de hacerlo funcionar, publicaré los detalles aquí.