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

Откуда: Киев
Сообщений: 272
Всем драсте.
При срабатывании тригерра в него предаются псевдо таблицы deleted и inserted. С ними все понятно. А вот как из тригерра сделать изменение записи на которую сработал сам тригерр или группы записей.
В Firebird или Oracle можно было так.

If :Old.Column_Name<>:New.Column_Name then 
      :New.Column_Name:=Save_Value;
      :New.Column_Name_1:=Save_Value_1;
     end if;

Подскажите как реализовать такую конструкцию на MsSQL.
Как вариант думал делать просто update по PK записи которая анализируется, но думаю в этом случае снова будет вызыватся тигерр, это нежелательно.
И как тогда можно реализовать версиозность записи. Если что то с записю происходит то повышаем версию. Соответственно эта версия уникальна как для таблицы или группы таблиц в которых используется.
Опять таки в Oracle делалось так.

Select Sq_Version.NextVal into New.ID_Version from dual;
Думаю если просто апдейтить по PK то будет снова вызыватся тригерр, и получится рекурсия - причем вечная.
2 ноя 09, 11:04    [7869511]     Ответить | Цитировать Сообщить модератору
 Re: Помощь по тригеррам  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31194
MorAdan
Как вариант думал делать просто update по PK записи которая анализируется, но думаю в этом случае снова будет вызыватся тигерр, это нежелательно.
Да, нужно делать update по PK записи. На рекурсивный вызов анализировать nest_level или просто их запретить в настройках.

MorAdan
И как тогда можно реализовать версиозность записи. Если что то с записю происходит то повышаем версию.
Для этого можно использовать instead of триггер
2 ноя 09, 11:12    [7869566]     Ответить | Цитировать Сообщить модератору
 Re: Помощь по тригеррам  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
1. Для отслеживания версии записи существует специальный тип данных ROWVERSION (он же сейчас пока что называется TIMESTAMP).
Достаточно добавить в таблицу поле такого типа.
2. Проапдейтить таблицу из триггера можно из JOINа этой таблицы с inserted и deleted.
Рекурсивное выполнение триггера, во-первых, управляется настройками базы и сервера,
в которых можно запретить вложенные и/или рекурсивные вызовы, а, во-вторых,
не допускать выполнение тела таких триггеров с помощью проверки в начале триггера
уровня вложенности или количества обрабатываемых записей.
2 ноя 09, 11:19    [7869613]     Ответить | Цитировать Сообщить модератору
 Re: Помощь по тригеррам  [new]
MorAdan
Member

Откуда: Киев
Сообщений: 272
iap,

Как я понимаю про рекурсивность -
- Можно запретить рекурсивность на уровне сервера.

iap
не допускать выполнение тела таких триггеров с помощью проверки в начале триггера
уровня вложенности или количества обрабатываемых записей.

Как это можно реализовать? Проверить что тригерр вызвался сам из себя, чтоб можно было отсетять ситуацию когда я делаю апдейт по join inserted, а когда у меня апдейт проходит из другого тригерра.
Например в 1 таблицу вносятся изменения, на ней срабатывает тригер и делает что то с в других таблицах, в одной из этих таблиц снова срабатывает тригерр на еще иную таблицу, а вот там и есть тригерр который пытается что то изменить в записи которую анализирует, как отсетять такие события?
2 ноя 09, 12:30    [7870220]     Ответить | Цитировать Сообщить модератору
 Re: Помощь по тригеррам  [new]
Glory
Member

Откуда:
Сообщений: 104760
MorAdan

Например в 1 таблицу вносятся изменения, на ней срабатывает тригер и делает что то с в других таблицах, в одной из этих таблиц снова срабатывает тригерр на еще иную таблицу, а вот там и есть тригерр который пытается что то изменить в записи которую анализирует, как отсетять такие события?

BOL - CREATE TRIGGER - Recursive Triggers, Nested Triggers
2 ноя 09, 12:31    [7870233]     Ответить | Цитировать Сообщить модератору
 Re: Помощь по тригеррам  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Glory
MorAdan

Например в 1 таблицу вносятся изменения, на ней срабатывает тригер и делает что то с в других таблицах, в одной из этих таблиц снова срабатывает тригерр на еще иную таблицу, а вот там и есть тригерр который пытается что то изменить в записи которую анализирует, как отсетять такие события?

BOL - CREATE TRIGGER - Recursive Triggers, Nested Triggers
+ @@ROWCOUNT, @@NESTLEVEL, TRIGGER_NESTLEVEL()
2 ноя 09, 13:06    [7870573]     Ответить | Цитировать Сообщить модератору
 Re: Помощь по тригеррам  [new]
MorAdan
Member

Откуда: Киев
Сообщений: 272
iap,
Спасибо.
2 ноя 09, 13:15    [7870656]     Ответить | Цитировать Сообщить модератору
 Re: Помощь по тригеррам  [new]
MorAdan
Member

Откуда: Киев
Сообщений: 272
iap,

Вопрос на последок. Есть прямая рекурсия и косвенная. С прямой все понятно.
А вот с косвененой.
Выполняю
EXECUTE sp_configure @configname='nested triggers';.

name minimum maximum config_value run_value
nested triggers   0   1   1   1


Не подскажете что это означает. Maximum=1?
Это число маскимальных косвенных рекурсий?
2 ноя 09, 13:24    [7870716]     Ответить | Цитировать Сообщить модератору
 Re: Помощь по тригеррам  [new]
Glory
Member

Откуда:
Сообщений: 104760
0 - disabled
1 - enabled
А уровень вложенности в MSSQL постоянный, не меняется и равен 32.
2 ноя 09, 13:43    [7870852]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить