Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сессионные переменные в тригере / 24 сообщений из 24, страница 1 из 1
18.09.2018, 13:35
    #39704214
_Groxot_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессионные переменные в тригере
Доброго дня.
Есть задумка вызывать тригер только один раз за сессию (проверять при старте триггера, не вызывался ли он уже сегодня)
Проверку сделать максимально простой чтобы не кушала время и ресурсы.

Есть ли варианты писать сессионные переменные чтобы они шарились между разными вызовами триггера?
В 2016 есть sp_set_session_context но мне нужна поддержка 2000 в худшем случае 2008
...
Рейтинг: 0 / 0
18.09.2018, 13:41
    #39704219
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессионные переменные в тригере
Таблица - лучшая переменная.
...
Рейтинг: 0 / 0
18.09.2018, 13:44
    #39704224
_Groxot_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессионные переменные в тригере
aleks222,

Каждый раз её проверять на наличие записи с условиями (пользователь, дата) будет накладно
...
Рейтинг: 0 / 0
18.09.2018, 13:49
    #39704234
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессионные переменные в тригере
_Groxot_aleks222,

Каждый раз её проверять на наличие записи с условиями (пользователь, дата) будет накладно
сессия же, ничего накладного
...
Рейтинг: 0 / 0
18.09.2018, 14:01
    #39704243
_Groxot_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессионные переменные в тригере
TaPaK,

Код: sql
1.
2.
3.
4.
5.
6.
IF OBJECT_ID('tempdb..#ISCLEARED') IS NULL BEGIN
	CREATE TABLE #ISCLEARED (flag bit)
	Insert into #ISCLEARED (flag) values (1)
// логика
END
GO
...
Рейтинг: 0 / 0
18.09.2018, 14:05
    #39704249
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессионные переменные в тригере
_Groxot_,

что это?
статическая таблийца SPID, Flag
...
Рейтинг: 0 / 0
18.09.2018, 14:08
    #39704255
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессионные переменные в тригере
_Groxot_Есть задумка вызывать тригер только один раз за сессию (проверять при старте триггера, не вызывался ли он уже сегодня)Так за сессию или за сегодня?

Если за сессию, то добавьте в начало триггера примерно такое:
Код: sql
1.
2.
3.
4.
5.
6.
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)');



ЗЫ: Лучше бы решаемую задачу озвучили - может найдется не столь экзотический вариант решения.
...
Рейтинг: 0 / 0
18.09.2018, 14:11
    #39704260
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессионные переменные в тригере
TaPaK_Groxot_,

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

_Groxot_В 2016 есть sp_set_session_context но мне нужна поддержка 2000 в худшем случае 2008Ещё есть set context_info, работает во всех версиях.
Итого, самые удобные варианты - либо временная таблица, либо context_info
...
Рейтинг: 0 / 0
18.09.2018, 14:14
    #39704265
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессионные переменные в тригере
авторЕсть задумка вызывать тригер только один раз за сессию (проверять при старте триггера, не вызывался ли он уже сегодня)
сегодня и сессия на временных объектах не решить
...
Рейтинг: 0 / 0
18.09.2018, 14:19
    #39704275
_Groxot_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессионные переменные в тригере
invm,
сессия
...
Рейтинг: 0 / 0
18.09.2018, 14:20
    #39704278
_Groxot_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессионные переменные в тригере
TaPaK,

сегодня = в пределах текущей сессии
...
Рейтинг: 0 / 0
18.09.2018, 14:22
    #39704280
_Groxot_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессионные переменные в тригере
alexeyvg,

Какова вероятность что этот SET CONTEXT_INFO кто то потрет?
Используют ли его, например ADO, в собственных целях?
...
Рейтинг: 0 / 0
18.09.2018, 14:24
    #39704286
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессионные переменные в тригере
_Groxot_invm,
сессияТогла либо через context_info, либо как я показал.
Через локальную временную таблицу не выйдет - помрет при завершении триггера.
Через статическую таблицу - дополнительные приседания для ее очистки.
...
Рейтинг: 0 / 0
18.09.2018, 14:28
    #39704289
_Groxot_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессионные переменные в тригере
invm,

временная глобальная с именем сессии судя по всему мой варинат, спасибо.
контекст кто то трет у меня (Delphi компонент видать какой)
...
Рейтинг: 0 / 0
18.09.2018, 14:39
    #39704295
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессионные переменные в тригере
действительно, динамика + беконечное создание временных таблиц sql-ю понравится, особенно в тенденции проблем как раз с массовым созданием этих самых временных таблиц
...
Рейтинг: 0 / 0
18.09.2018, 14:48
    #39704307
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессионные переменные в тригере
TaPaKдействительно, динамика + беконечное создание временных таблиц sql-ю понравится, особенно в тенденции проблем как раз с массовым созданием этих самых временных таблиц

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

ЗЫ. Триггеры не должны зависеть от "сессии".
...
Рейтинг: 0 / 0
18.09.2018, 15:12
    #39704329
_Groxot_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессионные переменные в тригере
aleks222,

почему не должен?
...
Рейтинг: 0 / 0
18.09.2018, 18:57
    #39704498
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессионные переменные в тригере
_Groxot_alexeyvg,

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

invmЧерез локальную временную таблицу не выйдет - помрет при завершении триггера.Понятно, это только если создавать её каждый раз при создании сессии на клиенте.
Это, наверное, совсем не оптимально, разве что триггер срабатывает в каждой сессии.
...
Рейтинг: 0 / 0
18.09.2018, 19:51
    #39704538
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессионные переменные в тригере
alexeyvgПонятно, это только если создавать её каждый раз при создании сессии на клиенте.Тогда уж лучше постоянную таблицу. По крайней мере не будет зависеть от клиента.
...
Рейтинг: 0 / 0
18.09.2018, 20:08
    #39704549
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессионные переменные в тригере
invmalexeyvgПонятно, это только если создавать её каждый раз при создании сессии на клиенте.Тогда уж лучше постоянную таблицу. По крайней мере не будет зависеть от клиента.Это да.
А ещё лучше - контекст.
...
Рейтинг: 0 / 0
18.09.2018, 21:23
    #39704591
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессионные переменные в тригере
alexeyvgА ещё лучше - контекст.Насколько я помню, добыть контекст на 2000-м было довольно затратно по времени.
...
Рейтинг: 0 / 0
19.09.2018, 01:05
    #39704634
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессионные переменные в тригере
invmalexeyvgА ещё лучше - контекст.Насколько я помню, добыть контекст на 2000-м было довольно затратно по времени.Хм, вот что то не помню такого, хотя мы широко использовали, и к перформансу относились внимательно (даже если это было не нужно)...
Кстати, контекст же можно получить не только функцией, но и из sysprocesses, может, что то из них работало быстро?
...
Рейтинг: 0 / 0
19.09.2018, 09:44
    #39704717
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессионные переменные в тригере
_Groxot_Есть задумка вызывать тригер только один раз за сессию (проверять при старте триггера, не вызывался ли он уже сегодня)
Проверку сделать максимально простой чтобы не кушала время и ресурсы.

Если среда исполнения полностью контролируемая, нет сторонних разработчиков и доступно изменение инициализации сессии, то можно использовать такие варианты, если их настройка не повлияет на выполняемое до триггера.
Запомнить предыдущее значение. Установить самом начале соединения свою "константу". В триггере проверить её. Потом вернуть предыдущее значение.
Код: sql
1.
2.
3.
select @@LOCK_TIMEOUT
SET LOCK_TIMEOUT 1234567890
select @@LOCK_TIMEOUT

или
Код: sql
1.
2.
3.
SELECT @@LANGID,@@LANGUAGE
SET LANGUAGE 'русский'
select * from syslanguages


Производительность метода мне неизвестна.
...
Рейтинг: 0 / 0
19.09.2018, 10:16
    #39704755
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сессионные переменные в тригере
alexeyvgХм, вот что то не помню такого, хотя мы широко использовали, и к перформансу относились внимательно (даже если это было не нужно)...
Кстати, контекст же можно получить не только функцией, но и из sysprocesses, может, что то из них работало быстро?Да вот отложилось в памяти, что были проблемы с производительностью. А вот подробности не отложились :)
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сессионные переменные в тригере / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]