sql >> Database >  >> RDS >> Sqlserver

Hoe aangepaste kenmerken toevoegen aan SQL-verbindingsreeks?

Er is geen algemene methode om aangepaste verbindingsreekskenmerken door te geven via client-API's en op te halen met behulp van T-SQL. Je hebt echter een aantal alternatieven. Hieronder staan ​​er een paar.

Methode 1 :Gebruik het sleutelwoord Application Name in de verbindingsreeks om maximaal 128 tekens door te geven en op te halen met de APP_NAME() T-SQL-functie:

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

SELECT APP_NAME();

Houd er rekening mee dat dit beperkt is tot 128 tekens en dat u de payload moet ontleden. Aangezien ADO.NET een afzonderlijke verbindingspool maakt voor elke afzonderlijke verbindingsreeks, moet u er ook rekening mee houden dat er in feite weinig of geen pooling van databaseverbindingen zal zijn.

Methode 2 :Voer een SET CONTEXT_INFO uit na verbinding en wijs maximaal 128 bytes toe die kunnen worden opgehaald met de CONTEXT_INFO) T-SQL-functie:

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

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

Merk op dat dit beperkt is tot 128 bytes en dat je de payload moet ontleden.

Methode 3 :maak een tijdelijke tabel op sessieniveau na verbinding en voeg naam/waarde-paren in die kunnen worden opgehaald met een SELECT-query:

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

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

Merk op dat u de grootte en het type van de attribuutwaarde naar behoefte kunt vergroten en dat parseren niet nodig is.

Methode 4 :Maak een permanente tabel op basis van sessie-ID en attribuutnaam, voeg naam/waarde-paren in na verbinding die kunnen worden opgehaald met een SELECT-query:

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

Merk op dat u de grootte en het type van de attribuutwaarde naar behoefte kunt vergroten en dat parseren niet nodig is.

BEWERKEN:

Methode 5 :Gebruik de opgeslagen procedure sp_set_session_context om naam/waarde-paren binnen het sessiebereik op te slaan en de waarden op te halen met de functie SESSION_CONTEXT(). Deze functie is geïntroduceerd in SQL Server 2016 en Azure SQL Database.

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


  1. Vergelijking van full text zoekmachine - Lucene, Sphinx, Postgresql, MySQL?

  2. MySQL-zelfstudie - Een beginnershandleiding om MySQL te leren

  3. Case-statement in MySQL

  4. Transacties werken niet voor mijn MySQL DB