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

Откуда:
Сообщений: 14
Есть триггер (схематично):

alter trigger tr1 on tabl after insert, update as
BEGIN
  if exists (select 1 from deleted)
    действия при UPDATE (1)
  else
    действия при INSERT (2)
END 


Срабатывает (т.е. выполняются действия) только при insert (2)

Как правильно идентифицировать инициирующее действие?

С MS SQL практически не знаком (пока).

Спасибо.
26 ноя 12, 23:33    [13533217]     Ответить | Цитировать Сообщить модератору
 Re: Как определить действие, вызвавшее срабатывание триггера?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37198
Однозначная идентификация возможна только при разных триггерах на insert и update.
26 ноя 12, 23:38    [13533233]     Ответить | Цитировать Сообщить модератору
 Re: Как определить действие, вызвавшее срабатывание триггера?  [new]
ooooooooooora
Member

Откуда:
Сообщений: 14
Гавриленко Сергей Алексеевич,

Спасибо, разобрался самостоятельно.
27 ноя 12, 00:02    [13533331]     Ответить | Цитировать Сообщить модератору
 Re: Как определить действие, вызвавшее срабатывание триггера?  [new]
sphinx_mv
Member [заблокирован]

Откуда:
Сообщений: 1672
Гавриленко Сергей Алексеевич
Однозначная идентификация возможна только при разных триггерах на insert и update.
Вообще-то, не обязательно...
Примерно такой запрос более/менее однозначно это определяет:
...
select
  case
    when a.pk is not null and b.pk is null then 'inserted'
    when a.pk is null and b.pk is not null then 'deleted'
                                           else 'updated'
from
  inserted a full outer join deleted b on a.pk = b.pk
...

Тут только нужно учесть, что записей может быть больше 1...
27 ноя 12, 00:09    [13533360]     Ответить | Цитировать Сообщить модератору
 Re: Как определить действие, вызвавшее срабатывание триггера?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37198
sphinx_mv
Гавриленко Сергей Алексеевич
Однозначная идентификация возможна только при разных триггерах на insert и update.
Вообще-то, не обязательно...
Примерно такой запрос более/менее однозначно это определяет:
...
select
  case
    when a.pk is not null and b.pk is null then 'inserted'
    when a.pk is null and b.pk is not null then 'deleted'
                                           else 'updated'
from
  inserted a full outer join deleted b on a.pk = b.pk
...

Тут только нужно учесть, что записей может быть больше 1...
Записей может быть 0, и тогда ваш запрос вообще ничего не определит.
27 ноя 12, 00:57    [13533488]     Ответить | Цитировать Сообщить модератору
 Re: Как определить действие, вызвавшее срабатывание триггера?  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8836
Гавриленко Сергей Алексеевич
sphinx_mv
пропущено...
Вообще-то, не обязательно...
Примерно такой запрос более/менее однозначно это определяет:
...
select
  case
    when a.pk is not null and b.pk is null then 'inserted'
    when a.pk is null and b.pk is not null then 'deleted'
                                           else 'updated'
from
  inserted a full outer join deleted b on a.pk = b.pk
...

Тут только нужно учесть, что записей может быть больше 1...
Записей может быть 0, и тогда ваш запрос вообще ничего не определит.

Злой, блин....
А нет записей - ну и не было ни чего ...
К приведённому запросу оин коментарий - нахрена join-ить таблицы inserted и deleted... Проще наличие записей посмотреть (особенно когда в записях при update меняется нахрен ВСЁ)... А так да, - обычно вешаются три тригера - с пофигсами _ins, _del, _upd ...
27 ноя 12, 01:20    [13533536]     Ответить | Цитировать Сообщить модератору
 Re: Как определить действие, вызвавшее срабатывание триггера?  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10232
Блог
можно вычислить удаление через columns_updated() = 0x

if columns_updated() = 0x
select 'DELETE' 
else 
select 'INSERT or UPDATE' 
27 ноя 12, 07:12    [13533729]     Ответить | Цитировать Сообщить модератору
 Re: Как определить действие, вызвавшее срабатывание триггера?  [new]
aleks2
Guest
Нет смысла париться.
Для тех "извращенных" случаев, когда insert/update/delete неразличимы, т.е. пустые таблицы inserted и deleted нету смысла различать.
27 ноя 12, 07:51    [13533757]     Ответить | Цитировать Сообщить модератору
 Re: Как определить действие, вызвавшее срабатывание триггера?  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
Можно ли в триггере(for U,I,D) определить какое действие над табл. вызвало его?
27 ноя 12, 09:29    [13534072]     Ответить | Цитировать Сообщить модератору
 Re: Как определить действие, вызвавшее срабатывание триггера?  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
Knyazev Alexey
можно вычислить удаление через columns_updated() = 0x

if columns_updated() = 0x
select 'DELETE' 
else 
select 'INSERT or UPDATE' 
Нет, Алексей, не годится: 7421084
27 ноя 12, 09:48    [13534167]     Ответить | Цитировать Сообщить модератору
 Re: Как определить действие, вызвавшее срабатывание триггера?  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10232
Блог
iap
Knyazev Alexey
можно вычислить удаление через columns_updated() = 0x

if columns_updated() = 0x
select 'DELETE' 
else 
select 'INSERT or UPDATE' 
Нет, Алексей, не годится: 7421084


так не честно ... это фейк
27 ноя 12, 10:15    [13534322]     Ответить | Цитировать Сообщить модератору
 Re: Как определить действие, вызвавшее срабатывание триггера?  [new]
sphinx_mv
Member [заблокирован]

Откуда:
Сообщений: 1672
SIMPLicity_
Гавриленко Сергей Алексеевич
пропущено...
Записей может быть 0, и тогда ваш запрос вообще ничего не определит.

Злой, блин....
А нет записей - ну и не было ни чего ...
Угу... DML не поменял ничего - ну, и... флаг ему в руки"... :)
SIMPLicity_
К приведённому запросу оин коментарий - нахрена join-ить таблицы inserted и deleted... Проще наличие записей посмотреть (особенно когда в записях при update меняется нахрен ВСЁ)...
По поводу комментария комментирую...
Кому-то может "не понравиться", но, обычно, если меня интересует выполнение определенных действия по insert/update/delete, то это интересует меня для каждой из затронутых записей. Соответственно, простого наличия записей в inserted/deleted уже не достаточно - тут нужен цикл по курсору ("общий вид" селекта для него продемонстрирован)...
Согласен, обработка в триггере на единомоментных вставках/одновлениях "нескольких млн. записей" - это "больно". Но тогда и не триггером обработку нужно делать.
SIMPLicity_
А так да, - обычно вешаются три тригера - с пофигсами _ins, _del, _upd ...
Аллергия на "много триггеров"... :)
А их каждого вида может быть "больше одного"... :(
27 ноя 12, 11:31    [13534806]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить