Brak uogólnionej metody przekazywania niestandardowych atrybutów ciągów połączenia za pośrednictwem interfejsów API klienta i pobierania za pomocą T-SQL. Masz jednak kilka alternatyw. Poniżej znajduje się kilka.
Metoda 1: Użyj słowa kluczowego nazwa aplikacji w ciągu połączenia, aby przejść do 128 znaków i pobierać z APP_NAME() funkcji T-SQL:
Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=DB;Data Source=SERVER;Application Name="SomeAttr=SomeValue"
SELECT APP_NAME();
Zauważ, że jest ograniczona do 128 znaków i będziesz musiał przeanalizować ładunek. Ponadto, ponieważ ADO.NET tworzy oddzielną pulę połączeń dla każdego odrębnego ciągu połączenia, należy wziąć pod uwagę, że efektywnie będzie mało lub nie będzie puli połączeń bazy danych.
Metoda 2: Wykonanie SET CONTEXT_INFO po podłączeniu i przypisać do 128 bajtów, które mogą być retreived z funkcją 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));
Zauważ, że jest ograniczona do 128 bajtów i będziesz musiał przeanalizować ładunek.
Metoda 3: Tworzenie poziomie sesji tabeli tymczasowej po podłączeniu i włożeniu pary nazwa/wartość, które mogą być pobrane z SELECT zapytania:
CREATE TABLE #CustomSessionAttributes(
AttributeName varchar(128) PRIMARY KEY
, AttributeValue varchar(1000));
INSERT INTO #CustomSessionAttributes VALUES('SomeAttr', 'SomeValue');
SELECT AttributeValue
FROM #CustomSessionAttributes
WHERE AttributeName = 'SomeAttr';
pamiętać, że można zwiększyć wielkość wartości atrybutów i wpisz w razie potrzeby i nie jest potrzebne przetwarzanie.
Metoda 4: utworzyć stały stół wprowadzonego przez ID sesji i nazwę atrybutu, włóż pary nazwa/wartość po połączeniu, które mogą być pobierane z SELECT zapytania:
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';
pamiętać, że można zwiększyć W razie potrzeby rozmiar i typ wartości atrybutu nie są potrzebne.
EDIT:
Metoda 5 Use procedura przechowywana sp_set_session_context do przechowywania pary nazwa/wartość session-scoped i pobrać wartości z funkcją SESSION_CONTEXT(). Ta funkcja została wprowadzona w SQL Server 2016 i Azure SQL Database.
EXEC sp_set_session_context 'SomeAttr', 'SomeValue';
SELECT SESSION_CONTEXT(N'SomeAttr');