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

Откуда:
Сообщений: 26
Вот сам триггер, очень простой

CREATE TRIGGER Deviations_UPDATE ON Deviations AFTER UPDATE
AS
IF @@ROWCOUNT = 0 RETURN
IF (UPDATE(DTE)) BEGIN
UPDATE Deviations SET NewData = 1
WHERE KeyD IN (SELECT KeyD FROM deleted)
END

не всегда отрабатывает, колонка DTE изначально принимает значение NULL, а через 1 секунду может уже принимать не NULL значение. Может кто-то с таким уже сталкивался с подобной проблемой или возможно я неверно триггер оформил. Заранее всем спасибо.
12 апр 13, 10:23    [14171197]     Ответить | Цитировать Сообщить модератору
 Re: Не всегда отрабатывает триггер, с чем это может связано?  [new]
Glory
Member

Откуда:
Сообщений: 104751
nickalaus
не всегда отрабатывает,

Не срабатывает триггер и не выполняется условие в коде триггера - это разные вещи
12 апр 13, 10:26    [14171211]     Ответить | Цитировать Сообщить модератору
 Re: Не всегда отрабатывает триггер, с чем это может связано?  [new]
Glory
Member

Откуда:
Сообщений: 104751
nickalaus
колонка DTE изначально принимает значение NULL, а через 1 секунду может уже принимать не NULL значение.

Это вы в своем клиентском приложении видите ?
12 апр 13, 10:26    [14171216]     Ответить | Цитировать Сообщить модератору
 Re: Не всегда отрабатывает триггер, с чем это может связано?  [new]
nickalaus
Member

Откуда:
Сообщений: 26
Glory
nickalaus
колонка DTE изначально принимает значение NULL, а через 1 секунду может уже принимать не NULL значение.

Это вы в своем клиентском приложении видите ?


смотрю в MS SQL
12 апр 13, 10:28    [14171223]     Ответить | Цитировать Сообщить модератору
 Re: Не всегда отрабатывает триггер, с чем это может связано?  [new]
Glory
Member

Откуда:
Сообщений: 104751
nickalaus
смотрю в MS SQL

Напрямую из файла данных в мозг что ли ?
12 апр 13, 10:31    [14171243]     Ответить | Цитировать Сообщить модератору
 Re: Не всегда отрабатывает триггер, с чем это может связано?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
nickalaus,

Если проапдейтить KeyD, то в таблице будет новое значение,
а UPDATE внутри триггера работает только для строк,
в которых KeyD не изменился и не равен NULL.

Пара замечаний, если позволите.
1. @@ROWCOUNT потеряет смысл, если таблицу будут использовать в MERGE
2. IF UPDATE(DTE) имеет мало смысла. Я бы это выкинул.
12 апр 13, 10:31    [14171247]     Ответить | Цитировать Сообщить модератору
 Re: Не всегда отрабатывает триггер, с чем это может связано?  [new]
nickalaus
Member

Откуда:
Сообщений: 26
iap
nickalaus,


2. IF UPDATE(DTE) имеет мало смысла. Я бы это выкинул.


как тогда проверять изменение колонки DTE ?
12 апр 13, 10:35    [14171269]     Ответить | Цитировать Сообщить модератору
 Re: Не всегда отрабатывает триггер, с чем это может связано?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
nickalaus
iap
nickalaus,


2. IF UPDATE(DTE) имеет мало смысла. Я бы это выкинул.


как тогда проверять изменение колонки DTE ?
Сравнением значений в deleted и inserted
А Вы думаете, что функция UPDATE() определяет, изменилось ли значение поля, да? :))
12 апр 13, 10:38    [14171296]     Ответить | Цитировать Сообщить модератору
 Re: Не всегда отрабатывает триггер, с чем это может связано?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
А вместо @@ROWCOUNT лучше EXISTS(SELECT * FROM inserted)
12 апр 13, 10:39    [14171309]     Ответить | Цитировать Сообщить модератору
 Re: Не всегда отрабатывает триггер, с чем это может связано?  [new]
nickalaus
Member

Откуда:
Сообщений: 26
iap
nickalaus
пропущено...


как тогда проверять изменение колонки DTE ?
Сравнением значений в deleted и inserted
А Вы думаете, что функция UPDATE() определяет, изменилось ли значение поля, да? :))


прочитал как работает :) функция UPDATE() возвращает истину в случае записи значения в конкретный столбец вне зависимости имело ли фактическое изменение значения этого столбца.
12 апр 13, 10:46    [14171359]     Ответить | Цитировать Сообщить модератору
 Re: Не всегда отрабатывает триггер, с чем это может связано?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
nickalaus
iap
пропущено...
Сравнением значений в deleted и inserted
А Вы думаете, что функция UPDATE() определяет, изменилось ли значение поля, да? :))


прочитал как работает :) функция UPDATE() возвращает истину в случае записи значения в конкретный столбец вне зависимости имело ли фактическое изменение значения этого столбца.
Да, определяет, было ли поле в списке SET команды UPDATE или нет.
12 апр 13, 10:48    [14171374]     Ответить | Цитировать Сообщить модератору
 Re: Не всегда отрабатывает триггер, с чем это может связано?  [new]
nickalaus
Member

Откуда:
Сообщений: 26
iap
nickalaus,

Если проапдейтить KeyD, то в таблице будет новое значение,
а UPDATE внутри триггера работает только для строк,
в которых KeyD не изменился и не равен NULL.


это условие выполняется, KeyD это ключ и он не изменяется а наращивается
12 апр 13, 11:02    [14171448]     Ответить | Цитировать Сообщить модератору
 Re: Не всегда отрабатывает триггер, с чем это может связано?  [new]
Glory
Member

Откуда:
Сообщений: 104751
nickalaus
это условие выполняется, KeyD это ключ и он не изменяется а наращивается

Как вы проверили, что триггре именно не срабатывает ?
А не то, что ваши IF-ы не выполняются
12 апр 13, 11:04    [14171465]     Ответить | Цитировать Сообщить модератору
 Re: Не всегда отрабатывает триггер, с чем это может связано?  [new]
nickalaus
Member

Откуда:
Сообщений: 26
Glory
nickalaus
это условие выполняется, KeyD это ключ и он не изменяется а наращивается

Как вы проверили, что триггре именно не срабатывает ?
А не то, что ваши IF-ы не выполняются


я слабак в MS SQL и не знаю как это делать, подскажите пожалуйста.
не пинайте сильно.
12 апр 13, 11:08    [14171491]     Ответить | Цитировать Сообщить модератору
 Re: Не всегда отрабатывает триггер, с чем это может связано?  [new]
Glory
Member

Откуда:
Сообщений: 104751
nickalaus
я слабак в MS SQL

Насколько слабак ? 0 ? -1 ?...
12 апр 13, 11:11    [14171508]     Ответить | Цитировать Сообщить модератору
 Re: Не всегда отрабатывает триггер, с чем это может связано?  [new]
nickalaus
Member

Откуда:
Сообщений: 26
опишу логику работы.

1. некое приложение(вернее сервис) пишет строку в таблицу Deviations, по умолчанию для столбца NewData установлена единица.
2. другое приложение проверяет столбец NewData, если равен единице считывает строку и обновляет столбец нулем.
3. далее если сервис обновил столбец DTE нужно выполнить триггер и пункт 2.
12 апр 13, 11:16    [14171549]     Ответить | Цитировать Сообщить модератору
 Re: Не всегда отрабатывает триггер, с чем это может связано?  [new]
nickalaus
Member

Откуда:
Сообщений: 26
Glory
nickalaus
я слабак в MS SQL

Насколько слабак ? 0 ? -1 ?...

0,5
12 апр 13, 11:17    [14171555]     Ответить | Цитировать Сообщить модератору
 Re: Не всегда отрабатывает триггер, с чем это может связано?  [new]
nickalaus
Member

Откуда:
Сообщений: 26
переписал условие ифа

IF ((COLUMNS_UPDATED() & 16) <> 0) BEGIN .....

посмотрю как будет работать, может взлетит :)
12 апр 13, 11:27    [14171626]     Ответить | Цитировать Сообщить модератору
 Re: Не всегда отрабатывает триггер, с чем это может связано?  [new]
Sergo-K
Member

Откуда:
Сообщений: 3
Кто-то выше уже указал, что лучше использовать updated / inserted. (Если я правильно понял, что делает триггер :)
12 апр 13, 11:37    [14171684]     Ответить | Цитировать Сообщить модератору
 Re: Не всегда отрабатывает триггер, с чем это может связано?  [new]
Glory
Member

Откуда:
Сообщений: 104751
nickalaus
переписал условие ифа

IF ((COLUMNS_UPDATED() & 16) <> 0) BEGIN .....

посмотрю как будет работать, может взлетит :)

Вы думаете, что механизмы определения обновления поля в COLUMNS_UPDATED и в UPDATE() отличаются ?

nickalaus
0,5

Добавить отладочные выводы для контроля хода выполнения триггера сможете ?
12 апр 13, 11:47    [14171769]     Ответить | Цитировать Сообщить модератору
 Re: Не всегда отрабатывает триггер, с чем это может связано?  [new]
nickalaus
Member

Откуда:
Сообщений: 26
Glory
Добавить отладочные выводы для контроля хода выполнения триггера сможете ?


подскажи как это сделать?
12 апр 13, 11:57    [14171839]     Ответить | Цитировать Сообщить модератору
 Re: Не всегда отрабатывает триггер, с чем это может связано?  [new]
Glory
Member

Откуда:
Сообщений: 104751
nickalaus
подскажи как это сделать?

Написать простой print ???
12 апр 13, 12:02    [14171867]     Ответить | Цитировать Сообщить модератору
 Re: Не всегда отрабатывает триггер, с чем это может связано?  [new]
nickalaus
Member

Откуда:
Сообщений: 26
Glory
nickalaus
подскажи как это сделать?

Написать простой print ???

смогу
12 апр 13, 12:05    [14171890]     Ответить | Цитировать Сообщить модератору
 Re: Не всегда отрабатывает триггер, с чем это может связано?  [new]
Crimean
Member

Откуда:
Сообщений: 13147
а если есть локальный сервер - никто не мешает без принтов все задебажить построчно
можно и не на локальном, но танцев с настройкой удаленной отладки много

К сообщению приложен файл. Размер - 7Kb
12 апр 13, 13:22    [14172445]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить