Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como adicionar atributos personalizados à string de conexão SQL?


Não há um método generalizado para passar atributos de string de conexão personalizados por meio de APIs de cliente e recuperar usando T-SQL. Você tem uma série de alternativas, no entanto. Abaixo estão alguns.

Método 1 :Use a palavra-chave Application Name na string de conexão para passar até 128 caracteres e recuperar com a função T-SQL APP_NAME():
Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=DB;Data Source=SERVER;Application Name="SomeAttr=SomeValue"

SELECT APP_NAME();

Observe que isso é limitado a 128 caracteres e você precisará analisar a carga útil. Além disso, como o ADO.NET cria um pool de conexão separado para cada string de conexão distinta, considere que haverá pouco ou nenhum pool de conexão de banco de dados.

Método 2 :Execute um SET CONTEXT_INFO após conectar e atribua até 128 bytes que podem ser recuperados com a função CONTEXT_INFO) 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));

Observe que isso é limitado a 128 bytes e você precisará analisar a carga útil.

Método 3 :Crie uma tabela temporária em nível de sessão após conectar e insira pares de nome/valor que podem ser recuperados com uma 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';

Observe que você pode aumentar o tamanho e o tipo do valor do atributo conforme necessário, e nenhuma análise é necessária.

Método 4 :Crie uma tabela permanente chaveada por id de sessão e nome de atributo, insira pares de nome/valor após conectar que podem ser recuperados com uma 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';

Observe que você pode aumentar o tamanho e o tipo do valor do atributo conforme necessário, e nenhuma análise é necessária.

EDITAR:

Método 5 Observação:use o procedimento armazenado sp_set_session_context para armazenar pares de nome/valor com escopo de sessão e recuperar os valores com a função SESSION_CONTEXT(). Esse recurso foi introduzido no SQL Server 2016 e no Banco de Dados SQL do Azure.
EXEC sp_set_session_context 'SomeAttr', 'SomeValue';
SELECT SESSION_CONTEXT(N'SomeAttr');