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

Come aggiungere attributi personalizzati alla stringa di connessione SQL?

Non esiste un metodo generalizzato per passare gli attributi della stringa di connessione personalizzati tramite le API client e recuperare utilizzando T-SQL. Hai una serie di alternative, però. Di seguito sono riportati alcuni.

Metodo 1 :utilizza la parola chiave Application Name nella stringa di connessione per passare fino a 128 caratteri e recuperare con la funzione T-SQL APP_NAME():

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

SELECT APP_NAME();

Nota che questo è limitato a 128 caratteri e dovrai analizzare il payload. Inoltre, poiché ADO.NET crea un pool di connessioni separato per ogni stringa di connessione distinta, considera che ci sarà effettivamente un pool di connessioni al database scarso o nullo.

Metodo 2 :Esegui un SET CONTEXT_INFO dopo la connessione e assegna fino a 128 byte che possono essere recuperati con la funzione T-SQL CONTEXT_INFO):

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

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

Nota che questo è limitato a 128 byte e dovrai analizzare il payload.

Metodo 3 :crea una tabella temporanea a livello di sessione dopo la connessione e inserisci coppie nome/valore che possono essere recuperate con una query 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';

Tieni presente che puoi aumentare la dimensione e il tipo del valore dell'attributo in base alle esigenze e non è necessaria alcuna analisi.

Metodo 4 :crea una tabella permanente con chiave per ID sessione e nome attributo, inserisci coppie nome/valore dopo la connessione che possono essere recuperate con una query 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';

Tieni presente che puoi aumentare la dimensione e il tipo del valore dell'attributo in base alle esigenze e non è necessaria alcuna analisi.

MODIFICA:

Metodo 5 :utilizzare la stored procedure sp_set_session_context per archiviare le coppie nome/valore nell'ambito della sessione e recuperare i valori con la funzione SESSION_CONTEXT(). Questa funzionalità è stata introdotta in SQL Server 2016 e nel database SQL di Azure.

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