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

¿Cómo agregar atributos personalizados a la cadena de conexión SQL?

No existe un método generalizado para pasar atributos de cadena de conexión personalizados a través de las API de cliente y recuperarlos mediante T-SQL. Sin embargo, tienes varias alternativas. A continuación se muestran algunos.

Método 1 :Use la palabra clave Nombre de la aplicación en la cadena de conexión para pasar hasta 128 caracteres y recuperar con la función APP_NAME() T-SQL:

Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=DB;Data Source=SERVER;Application Name="SomeAttr=SomeValue"

SELECT APP_NAME();

Tenga en cuenta que esto está limitado a 128 caracteres y deberá analizar la carga útil. Además, dado que ADO.NET crea un grupo de conexiones separado para cada cadena de conexión distinta, considere que efectivamente habrá poco o ningún grupo de conexiones de bases de datos.

Método 2 :Ejecute SET CONTEXT_INFO después de conectarse y asigne hasta 128 bytes que se pueden recuperar con CONTEXT_INFO) Función T-SQL:

DECLARE @context_info varbinary(128) = CAST('SomeAttr=SomeValue' AS varbinary(128));
SET CONTEXT_INFO @context_info;

SELECT CAST(CONTEXT_INFO() AS varchar(128));

Tenga en cuenta que esto está limitado a 128 bytes y deberá analizar la carga útil.

Método 3 :Cree una tabla temporal a nivel de sesión después de conectarse e inserte pares de nombre/valor que se puedan recuperar con una consulta SELECT:

CREATE TABLE #CustomSessionAttributes(
      AttributeName varchar(128) PRIMARY KEY
    , AttributeValue varchar(1000));
INSERT INTO #CustomSessionAttributes VALUES('SomeAttr', 'SomeValue');

SELECT AttributeValue 
FROM #CustomSessionAttributes 
WHERE AttributeName = 'SomeAttr';

Tenga en cuenta que puede aumentar el tamaño y el tipo del valor del atributo según sea necesario, y no es necesario analizarlo.

Método 4 :Cree una tabla permanente codificada por ID de sesión y nombre de atributo, inserte pares de nombre/valor después de la conexión que se pueden recuperar con una consulta SELECT:

CREATE TABLE dbo.CustomSessionAttributes(
      SessionID smallint
    , AttributeName varchar(128)
    , AttributeValue varchar(1000)
    , CONSTRAINT PK_CustomSessionAttributes PRIMARY KEY (SessionID, AttributeName)
    );
--clean up previous session
DELETE FROM dbo.CustomSessionAttributes WHERE SessionID = @@SPID; 
--insert values for this session
INSERT INTO dbo.CustomSessionAttributes VALUES(@@SPID, 'SomeAttr', 'SomeValue');

--retreive attribute value
SELECT AttributeValue 
FROM dbo.CustomSessionAttributes 
WHERE
    SessionID = @@SPID 
    AND AttributeName = 'SomeAttr';

Tenga en cuenta que puede aumentar el tamaño y el tipo del valor del atributo según sea necesario, y no es necesario analizarlo.

EDITAR:

Método 5 :Utilice el procedimiento almacenado sp_set_session_context para almacenar pares de nombre/valor en el ámbito de la sesión y recuperar los valores con la función SESSION_CONTEXT(). Esta función se introdujo en SQL Server 2016 y Azure SQL Database.

EXEC sp_set_session_context 'SomeAttr', 'SomeValue';
SELECT SESSION_CONTEXT(N'SomeAttr');