Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сессионные переменные в тригере  [new]
_Groxot_
Member

Откуда: Оттуда
Сообщений: 481
Доброго дня.
Есть задумка вызывать тригер только один раз за сессию (проверять при старте триггера, не вызывался ли он уже сегодня)
Проверку сделать максимально простой чтобы не кушала время и ресурсы.

Есть ли варианты писать сессионные переменные чтобы они шарились между разными вызовами триггера?
В 2016 есть sp_set_session_context но мне нужна поддержка 2000 в худшем случае 2008
18 сен 18, 13:35    [21678066]     Ответить | Цитировать Сообщить модератору
 Re: Сессионные переменные в тригере  [new]
aleks222
Member

Откуда:
Сообщений: 956
Таблица - лучшая переменная.
18 сен 18, 13:41    [21678076]     Ответить | Цитировать Сообщить модератору
 Re: Сессионные переменные в тригере  [new]
_Groxot_
Member

Откуда: Оттуда
Сообщений: 481
aleks222,

Каждый раз её проверять на наличие записи с условиями (пользователь, дата) будет накладно
18 сен 18, 13:44    [21678082]     Ответить | Цитировать Сообщить модератору
 Re: Сессионные переменные в тригере  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
_Groxot_
aleks222,

Каждый раз её проверять на наличие записи с условиями (пользователь, дата) будет накладно

сессия же, ничего накладного
18 сен 18, 13:49    [21678099]     Ответить | Цитировать Сообщить модератору
 Re: Сессионные переменные в тригере  [new]
_Groxot_
Member

Откуда: Оттуда
Сообщений: 481
TaPaK,

IF OBJECT_ID('tempdb..#ISCLEARED') IS NULL BEGIN
	CREATE TABLE #ISCLEARED (flag bit)
	Insert into #ISCLEARED (flag) values (1)
// логика
END
GO
18 сен 18, 14:01    [21678120]     Ответить | Цитировать Сообщить модератору
 Re: Сессионные переменные в тригере  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
_Groxot_,

что это?
статическая таблийца SPID, Flag
18 сен 18, 14:05    [21678128]     Ответить | Цитировать Сообщить модератору
 Re: Сессионные переменные в тригере  [new]
invm
Member

Откуда: Москва
Сообщений: 9347
_Groxot_
Есть задумка вызывать тригер только один раз за сессию (проверять при старте триггера, не вызывался ли он уже сегодня)
Так за сессию или за сегодня?

Если за сессию, то добавьте в начало триггера примерно такое:
declare @tablename sysname = N'##MyTrigger' + cast(@@spid as nvarchar(10));

if object_id(N'tempdb..' + @tablename) is not null
 return;

exec(N'create table ' + @tablename + N' (dummy int)');


ЗЫ: Лучше бы решаемую задачу озвучили - может найдется не столь экзотический вариант решения.
18 сен 18, 14:08    [21678138]     Ответить | Цитировать Сообщить модератору
 Re: Сессионные переменные в тригере  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
TaPaK
_Groxot_,

что это?
статическая таблийца SPID, Flag
А что, надёжный и простой способ, проще, чем со статической таблицей (там ещё нужно время создания сессии сохранять и сравнивать, да плюс помнить о блокировках)

_Groxot_
В 2016 есть sp_set_session_context но мне нужна поддержка 2000 в худшем случае 2008
Ещё есть set context_info, работает во всех версиях.
Итого, самые удобные варианты - либо временная таблица, либо context_info
18 сен 18, 14:11    [21678146]     Ответить | Цитировать Сообщить модератору
 Re: Сессионные переменные в тригере  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
автор
Есть задумка вызывать тригер только один раз за сессию (проверять при старте триггера, не вызывался ли он уже сегодня)

сегодня и сессия на временных объектах не решить
18 сен 18, 14:14    [21678151]     Ответить | Цитировать Сообщить модератору
 Re: Сессионные переменные в тригере  [new]
_Groxot_
Member

Откуда: Оттуда
Сообщений: 481
invm,
сессия
18 сен 18, 14:19    [21678166]     Ответить | Цитировать Сообщить модератору
 Re: Сессионные переменные в тригере  [new]
_Groxot_
Member

Откуда: Оттуда
Сообщений: 481
TaPaK,

сегодня = в пределах текущей сессии
18 сен 18, 14:20    [21678169]     Ответить | Цитировать Сообщить модератору
 Re: Сессионные переменные в тригере  [new]
_Groxot_
Member

Откуда: Оттуда
Сообщений: 481
alexeyvg,

Какова вероятность что этот SET CONTEXT_INFO кто то потрет?
Используют ли его, например ADO, в собственных целях?
18 сен 18, 14:22    [21678172]     Ответить | Цитировать Сообщить модератору
 Re: Сессионные переменные в тригере  [new]
invm
Member

Откуда: Москва
Сообщений: 9347
_Groxot_
invm,
сессия
Тогла либо через context_info, либо как я показал.
Через локальную временную таблицу не выйдет - помрет при завершении триггера.
Через статическую таблицу - дополнительные приседания для ее очистки.
18 сен 18, 14:24    [21678181]     Ответить | Цитировать Сообщить модератору
 Re: Сессионные переменные в тригере  [new]
_Groxot_
Member

Откуда: Оттуда
Сообщений: 481
invm,

временная глобальная с именем сессии судя по всему мой варинат, спасибо.
контекст кто то трет у меня (Delphi компонент видать какой)
18 сен 18, 14:28    [21678185]     Ответить | Цитировать Сообщить модератору
 Re: Сессионные переменные в тригере  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
действительно, динамика + беконечное создание временных таблиц sql-ю понравится, особенно в тенденции проблем как раз с массовым созданием этих самых временных таблиц
18 сен 18, 14:39    [21678202]     Ответить | Цитировать Сообщить модератору
 Re: Сессионные переменные в тригере  [new]
aleks222
Member

Откуда:
Сообщений: 956
TaPaK
действительно, динамика + беконечное создание временных таблиц sql-ю понравится, особенно в тенденции проблем как раз с массовым созданием этих самых временных таблиц


Это фсе ерунда. На фоне connection pool и приложения, которое пользует этот connection pool.

ЗЫ. Триггеры не должны зависеть от "сессии".
18 сен 18, 14:48    [21678224]     Ответить | Цитировать Сообщить модератору
 Re: Сессионные переменные в тригере  [new]
_Groxot_
Member

Откуда: Оттуда
Сообщений: 481
aleks222,

почему не должен?
18 сен 18, 15:12    [21678261]     Ответить | Цитировать Сообщить модератору
 Re: Сессионные переменные в тригере  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
_Groxot_
alexeyvg,

Какова вероятность что этот SET CONTEXT_INFO кто то потрет?
Используют ли его, например ADO, в собственных целях?
Нет, никто не использует.

invm
Через локальную временную таблицу не выйдет - помрет при завершении триггера.
Понятно, это только если создавать её каждый раз при создании сессии на клиенте.
Это, наверное, совсем не оптимально, разве что триггер срабатывает в каждой сессии.
18 сен 18, 18:57    [21678601]     Ответить | Цитировать Сообщить модератору
 Re: Сессионные переменные в тригере  [new]
invm
Member

Откуда: Москва
Сообщений: 9347
alexeyvg
Понятно, это только если создавать её каждый раз при создании сессии на клиенте.
Тогда уж лучше постоянную таблицу. По крайней мере не будет зависеть от клиента.
18 сен 18, 19:51    [21678674]     Ответить | Цитировать Сообщить модератору
 Re: Сессионные переменные в тригере  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
invm
alexeyvg
Понятно, это только если создавать её каждый раз при создании сессии на клиенте.
Тогда уж лучше постоянную таблицу. По крайней мере не будет зависеть от клиента.
Это да.
А ещё лучше - контекст.
18 сен 18, 20:08    [21678701]     Ответить | Цитировать Сообщить модератору
 Re: Сессионные переменные в тригере  [new]
invm
Member

Откуда: Москва
Сообщений: 9347
alexeyvg
А ещё лучше - контекст.
Насколько я помню, добыть контекст на 2000-м было довольно затратно по времени.
18 сен 18, 21:23    [21678785]     Ответить | Цитировать Сообщить модератору
 Re: Сессионные переменные в тригере  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
invm
alexeyvg
А ещё лучше - контекст.
Насколько я помню, добыть контекст на 2000-м было довольно затратно по времени.
Хм, вот что то не помню такого, хотя мы широко использовали, и к перформансу относились внимательно (даже если это было не нужно)...
Кстати, контекст же можно получить не только функцией, но и из sysprocesses, может, что то из них работало быстро?
19 сен 18, 01:05    [21678898]     Ответить | Цитировать Сообщить модератору
 Re: Сессионные переменные в тригере  [new]
tunknown
Member

Откуда:
Сообщений: 760
_Groxot_
Есть задумка вызывать тригер только один раз за сессию (проверять при старте триггера, не вызывался ли он уже сегодня)
Проверку сделать максимально простой чтобы не кушала время и ресурсы.


Если среда исполнения полностью контролируемая, нет сторонних разработчиков и доступно изменение инициализации сессии, то можно использовать такие варианты, если их настройка не повлияет на выполняемое до триггера.
Запомнить предыдущее значение. Установить самом начале соединения свою "константу". В триггере проверить её. Потом вернуть предыдущее значение.
select @@LOCK_TIMEOUT
SET LOCK_TIMEOUT 1234567890
select @@LOCK_TIMEOUT
или
SELECT @@LANGID,@@LANGUAGE
SET LANGUAGE 'русский'
select * from syslanguages

Производительность метода мне неизвестна.
19 сен 18, 09:44    [21679032]     Ответить | Цитировать Сообщить модератору
 Re: Сессионные переменные в тригере  [new]
invm
Member

Откуда: Москва
Сообщений: 9347
alexeyvg
Хм, вот что то не помню такого, хотя мы широко использовали, и к перформансу относились внимательно (даже если это было не нужно)...
Кстати, контекст же можно получить не только функцией, но и из sysprocesses, может, что то из них работало быстро?
Да вот отложилось в памяти, что были проблемы с производительностью. А вот подробности не отложились :)
19 сен 18, 10:16    [21679095]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить