Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment ajouter des attributs personnalisés à la chaîne de connexion SQL ?

Il n'existe pas de méthode généralisée pour transmettre des attributs de chaîne de connexion personnalisés via les API client et les récupérer à l'aide de T-SQL. Vous avez un certain nombre d'alternatives, cependant. En voici quelques-unes.

Méthode 1  :Utilisez le mot-clé Nom de l'application dans la chaîne de connexion pour transmettre jusqu'à 128 caractères et récupérer avec la fonction T-SQL APP_NAME() :

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

SELECT APP_NAME();

Notez que cela est limité à 128 caractères et que vous devrez analyser la charge utile. De plus, étant donné qu'ADO.NET crée un pool de connexions distinct pour chaque chaîne de connexion distincte, considérez qu'il y aura effectivement peu ou pas de pool de connexions de base de données.

Méthode 2 :Exécutez un SET CONTEXT_INFO après la connexion et affectez jusqu'à 128 octets pouvant être récupérés avec la fonction 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));

Notez que cela est limité à 128 octets et que vous devrez analyser la charge utile.

Méthode 3  :Créez une table temporaire au niveau de la session après la connexion et insérez des paires nom/valeur pouvant être récupérées avec une requête 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';

Notez que vous pouvez augmenter la taille et le type de la valeur d'attribut selon vos besoins, et qu'aucune analyse n'est nécessaire.

Méthode 4  :Créez une table permanente indexée par l'identifiant de session et le nom d'attribut, insérez des paires nom/valeur après la connexion qui peuvent être récupérées avec une requête 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';

Notez que vous pouvez augmenter la taille et le type de la valeur d'attribut selon vos besoins, et qu'aucune analyse n'est nécessaire.

MODIF :

Méthode 5 :utilisez la procédure stockée sp_set_session_context pour stocker les paires nom/valeur de session et récupérer les valeurs avec la fonction SESSION_CONTEXT(). Cette fonctionnalité a été introduite dans SQL Server 2016 et Azure SQL Database.

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