Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie füge ich benutzerdefinierte Attribute zur SQL-Verbindungszeichenfolge hinzu?

Es gibt keine verallgemeinerte Methode, um benutzerdefinierte Verbindungszeichenfolgenattribute über Client-APIs zu übergeben und mit T-SQL abzurufen. Sie haben jedoch eine Reihe von Alternativen. Unten sind ein paar.

Methode 1 :Verwenden Sie das Schlüsselwort Application Name in der Verbindungszeichenfolge, um bis zu 128 Zeichen zu übergeben und mit der T-SQL-Funktion APP_NAME() abzurufen:

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

SELECT APP_NAME();

Beachten Sie, dass dies auf 128 Zeichen begrenzt ist und Sie die Nutzlast analysieren müssen. Da ADO.NET einen separaten Verbindungspool für jede eindeutige Verbindungszeichenfolge erstellt, sollten Sie bedenken, dass es praktisch kein oder nur ein geringes Pooling von Datenbankverbindungen geben wird.

Methode 2 :Führen Sie nach dem Verbinden ein SET CONTEXT_INFO aus und weisen Sie bis zu 128 Bytes zu, die mit der T-SQL-Funktion CONTEXT_INFO abgerufen werden können:

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

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

Beachten Sie, dass dies auf 128 Byte begrenzt ist und Sie die Nutzdaten parsen müssen.

Methode 3 :Erstellen Sie nach dem Verbinden eine temporäre Tabelle auf Sitzungsebene und fügen Sie Name/Wert-Paare ein, die mit einer SELECT-Abfrage abgerufen werden können:

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

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

Beachten Sie, dass Sie die Größe und den Typ des Attributwerts nach Bedarf erhöhen können und keine Analyse erforderlich ist.

Methode 4 :Erstellen Sie eine permanente Tabelle mit Sitzungs-ID und Attributnamen, fügen Sie Name/Wert-Paare nach dem Verbinden ein, die mit einer SELECT-Abfrage abgerufen werden können:

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';

Beachten Sie, dass Sie die Größe und den Typ des Attributwerts nach Bedarf erhöhen können und keine Analyse erforderlich ist.

BEARBEITEN:

Methode 5 Fehlerbeseitigung:Verwenden Sie die gespeicherte Prozedur sp_set_session_context, um sitzungsbezogene Name/Wert-Paare zu speichern und die Werte mit der Funktion SESSION_CONTEXT() abzurufen. Diese Funktion wurde in SQL Server 2016 und Azure SQL-Datenbank eingeführt.

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