Как добавить пользовательские атрибуты в строку подключения SQL?

Я хочу добавить некоторые пользовательские атрибуты в строку подключения SqlServer, что-то вроде этого:

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

И затем получить этот атрибут в SQL. например SELECT SOME_FUNCTION('SomeAttr')

2 ответа

Решение

Не существует обобщенного метода для передачи пользовательских атрибутов строки соединения через клиентские API-интерфейсы и извлечения с использованием T-SQL. У вас есть несколько альтернатив. Ниже приведены несколько.

Способ 1. Используйте ключевое слово "Имя приложения" в строке подключения, чтобы передать до 128 символов и получить с помощью функции T-SQL APP_NAME():

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

SELECT APP_NAME();

Обратите внимание, что это ограничено 128 символами, и вам нужно будет проанализировать полезную нагрузку. Кроме того, поскольку ADO.NET создает отдельный пул соединений для каждой отдельной строки соединения, учтите, что в действительности пул соединений с базой данных будет небольшим или вообще не будет.

Способ 2: выполнить SET CONTEXT_INFO после подключения и назначить до 128 байтов, которые можно получить с помощью функции TEXD 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));

Обратите внимание, что это ограничено 128 байтами, и вам нужно будет проанализировать полезную нагрузку.

Метод 3: Создайте временную таблицу уровня сеанса после подключения и вставьте пары имя / значение, которые можно получить с помощью запроса 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';

Обратите внимание, что при необходимости вы можете увеличить размер и тип значения атрибута, и анализ не требуется.

Способ 4. Создайте постоянную таблицу, основанную на идентификаторе сеанса и имени атрибута, вставьте пары имя / значение после подключения, которые можно получить с помощью запроса 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';

Обратите внимание, что при необходимости вы можете увеличить размер и тип значения атрибута, и анализ не требуется.

РЕДАКТИРОВАТЬ:

Метод 5: Используйте хранимую процедуру sp_set_session_context для хранения пар имя / значение в рамках сеанса и получения значений с помощью функции SESSION_CONTEXT(). Эта функция была представлена ​​в SQL Server 2016 и базе данных SQL Azure.

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

Вы можете использовать ключевые слова WSID и APP в строке подключения. Вы можете прочитать эти значения, используя функции HOST_NAME() и APP_NAME(). См. http://msdn.microsoft.com/en-us/library/ms130822.aspx для получения подробной информации.

Другие вопросы по тегам