Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Триггер UPDATE срабатывает при INSERT  [new]
Scend
Member

Откуда:
Сообщений: 298
Здравствуйте!
Подскажите, как сделать правильно:
Есть 2 простых триггера INSERT и UPDATE на одной таблице:

INSERT
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [tr_tab_I]
   ON tTab
   FOR INSERT
AS

BEGIN
    SET NOCOUNT ON;

....

END


UPDATE
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [tr_tab_U]
   ON tTab
   FOR UPDATE
AS

BEGIN
    SET NOCOUNT ON;

....

END


При обновлении записи в таблице tTab срабатывает триггер tr_tab_U (все нормально).
При вставке записи в таблицу tTab срабатывает триггер tr_tab_I и затем срабатывает триггер tr_tab_U.

Как сделать, чтобы при вставке записи в таблицу tTab срабатывал ТОЛЬКО триггер INSERT tr_tab_I. а триггер UPDATE tr_tab_U не срабатывал.
18 авг 16, 17:23    [19559505]     Ответить | Цитировать Сообщить модератору
 Re: Триггер UPDATE срабатывает при INSERT  [new]
iap
Member

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

небось, в триггере на INSERT выполняется UPDATE той же таблицы?
18 авг 16, 17:28    [19559526]     Ответить | Цитировать Сообщить модератору
 Re: Триггер UPDATE срабатывает при INSERT  [new]
TaPaK
Member

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

перестать делать UPDATE в триггере :)
18 авг 16, 17:30    [19559536]     Ответить | Цитировать Сообщить модератору
 Re: Триггер UPDATE срабатывает при INSERT  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Scend
При вставке записи в таблицу tTab срабатывает триггер tr_tab_I и затем срабатывает триггер tr_tab_U.
Наверное, потому что где-то там среди ваших .... есть апдейт таблицы tTab.
18 авг 16, 17:30    [19559541]     Ответить | Цитировать Сообщить модератору
 Re: Триггер UPDATE срабатывает при INSERT  [new]
Scend
Member

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

небось, в триггере на INSERT выполняется UPDATE той же таблицы?

Нет, в INSERT происходит INSERT в другой таблице.
18 авг 16, 17:32    [19559547]     Ответить | Цитировать Сообщить модератору
 Re: Триггер UPDATE срабатывает при INSERT  [new]
Гавриленко Сергей Алексеевич
Member

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

небось, в триггере на INSERT выполняется UPDATE той же таблицы?

Нет, в INSERT происходит INSERT в другой таблице.
На которой тоже есть триггер, да?
18 авг 16, 17:32    [19559549]     Ответить | Цитировать Сообщить модератору
 Re: Триггер UPDATE срабатывает при INSERT  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Scend
iap
Scend,

небось, в триггере на INSERT выполняется UPDATE той же таблицы?

Нет, в INSERT происходит INSERT в другой таблице.

не верю :)
18 авг 16, 17:33    [19559554]     Ответить | Цитировать Сообщить модератору
 Re: Триггер UPDATE срабатывает при INSERT  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
а вообще есть
https://technet.microsoft.com/ru-ru/library/ms191520(v=sql.105).aspx
но это на уровне базы
18 авг 16, 17:36    [19559572]     Ответить | Цитировать Сообщить модератору
 Re: Триггер UPDATE срабатывает при INSERT  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8821
Или автор лукавит и не пишет о merge.
18 авг 16, 17:36    [19559575]     Ответить | Цитировать Сообщить модератору
 Re: Триггер UPDATE срабатывает при INSERT  [new]
Scend
Member

Откуда:
Сообщений: 298
Гавриленко Сергей Алексеевич
Scend
пропущено...

Нет, в INSERT происходит INSERT в другой таблице.
На которой тоже есть триггер, да?

Триггер есть, но он отключен.
18 авг 16, 17:36    [19559577]     Ответить | Цитировать Сообщить модератору
 Re: Триггер UPDATE срабатывает при INSERT  [new]
TaPaK
Member

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

т.е. сервер просто от скуки страдает...
18 авг 16, 17:37    [19559583]     Ответить | Цитировать Сообщить модератору
 Re: Триггер UPDATE срабатывает при INSERT  [new]
Scend
Member

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

т.е. сервер просто от скуки страдает...


Сам не пойму, что происходит. )

Пробовал отключать-включать триггер UPDATE
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [tr_tab_I]
   ON tTab
   FOR INSERT
AS

BEGIN
    SET NOCOUNT ON;
 DISABLE TRIGGER [tr_tab_U] ON tTab;
....
ENABLE TRIGGER [tr_tab_U] ON tTab;
END

Но не помогло.
18 авг 16, 17:48    [19559632]     Ответить | Цитировать Сообщить модератору
 Re: Триггер UPDATE срабатывает при INSERT  [new]
TaPaK
Member

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

а соседним транзакциям не нужен этот триггер? так убейте его на века тогда :)
18 авг 16, 17:55    [19559660]     Ответить | Цитировать Сообщить модератору
 Re: Триггер UPDATE срабатывает при INSERT  [new]
iap
Member

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

перестаньте дизэйблить триггер! Да ещё в триггере!
Эта команда DDL - для администратора.

Лучше внимательно просмотрите текст триггеров.
18 авг 16, 17:56    [19559666]     Ответить | Цитировать Сообщить модератору
 Re: Триггер UPDATE срабатывает при INSERT  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
и по прежнему: просто так сервер не будет дёргать триггер.
18 авг 16, 17:56    [19559670]     Ответить | Цитировать Сообщить модератору
 Re: Триггер UPDATE срабатывает при INSERT  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Scend,

> и затем срабатывает триггер tr_tab_U.

для начала скажите, как вы это определили?
18 авг 16, 18:11    [19559717]     Ответить | Цитировать Сообщить модератору
 Re: Триггер UPDATE срабатывает при INSERT  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3155
Включите логирование всех операций в профайлере, и посмотрите кто инициирует вставку.
18 авг 16, 22:12    [19560597]     Ответить | Цитировать Сообщить модератору
 Re: Триггер UPDATE срабатывает при INSERT  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Локшин Марк
Включите логирование всех операций в профайлере, и посмотрите кто инициирует вставку.

update же )
18 авг 16, 22:51    [19560770]     Ответить | Цитировать Сообщить модератору
 Re: Триггер UPDATE срабатывает при INSERT  [new]
Scend
Member

Откуда:
Сообщений: 298
daw
Scend,

> и затем срабатывает триггер tr_tab_U.

для начала скажите, как вы это определили?

Смотрю результат выполнения этого триггера tr_tab_U - он меняет данные в строке.

Обнаружил следующее:
Если просто в Менеджмент Студии выполнить действие триггера tr_tab_I, то нужная запись вставляется в другую таблицу и триггер tr_tab_U не срабатывает!
Но, если сделать вставку записи через программу П, которая эти записи вставляет, то нужная запись вставляется в другую таблицу и затем триггер tr_tab_U срабатывает. Т.е., получается П вставляет запись в таблицу tTab и затем что-то в этой же записи обновляет, раз срабатывает триггер tr_tab_U UPDATE? Но в базе в таблице не вижу, что там обновляется.
19 авг 16, 09:43    [19561590]     Ответить | Цитировать Сообщить модератору
 Re: Триггер UPDATE срабатывает при INSERT  [new]
aleks2
Guest
Scend
Обнаружил следующее:
Если просто в Менеджмент Студии выполнить действие триггера tr_tab_I, то нужная запись вставляется в другую таблицу и триггер tr_tab_U не срабатывает!
Но, если сделать вставку записи через программу П, которая эти записи вставляет, то нужная запись вставляется в другую таблицу и затем триггер tr_tab_U срабатывает. Т.е., получается П вставляет запись в таблицу tTab и затем что-то в этой же записи обновляет, раз срабатывает триггер tr_tab_U UPDATE? Но в базе в таблице не вижу, что там обновляется.


Ну хватит уже переводить кофейную гущу.
Будь мужиком - запусти профайлер.

ЗЫ. Хрен его знает, что там твое приложение исполняет.
19 авг 16, 09:47    [19561617]     Ответить | Цитировать Сообщить модератору
 Re: Триггер UPDATE срабатывает при INSERT  [new]
Scend
Member

Откуда:
Сообщений: 298
Посмотрел профайлером: После вставки новой записи, происходит UPDATE поля модификации (datetime) этой же записи.
Поэтому, видимо и срабатывает триггер UPDATE после INSERT. Доступа к исходникам к этому приложению нет.
Можно ли как-то обойти этот UPDATE поля модификации, чтобы он не запускал триггер tr_tab_U?
19 авг 16, 10:52    [19562184]     Ответить | Цитировать Сообщить модератору
 Re: Триггер UPDATE срабатывает при INSERT  [new]
TaPaK
Member

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

автор
UPDATE поля модификации (datetime) этой же записи.

кто это инициирует?
19 авг 16, 10:55    [19562203]     Ответить | Цитировать Сообщить модератору
 Re: Триггер UPDATE срабатывает при INSERT  [new]
Scend
Member

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

автор
UPDATE поля модификации (datetime) этой же записи.

кто это инициирует?

Судя по всему инициирует само приложение, т.к. никаких триггеров у данной таблицы нет.
19 авг 16, 11:01    [19562259]     Ответить | Цитировать Сообщить модератору
 Re: Триггер UPDATE срабатывает при INSERT  [new]
TaPaK
Member

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

а профайлер вам так и пишет: "судя по всему"?
19 авг 16, 11:05    [19562291]     Ответить | Цитировать Сообщить модератору
 Re: Триггер UPDATE срабатывает при INSERT  [new]
Scend
Member

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

а профайлер вам так и пишет: "судя по всему"?

Вот строчка в профайлере:
UPDATE tTab
SET
	[ModifiedOn] = @P2
WHERE
	[Id] = @P1',N'@P1 uniqueidentifier,@P2 datetime2(7)',@P1='E6B7511C-FB02-4A4C-970B-60D2EBD3BE87',@P2='2016-08-19 07:41:25.6980221'	.Net SqlClient Data Provider	система	NT AUTHORITY\система	16	8	0	28	5408	64	2016-08-19 10:41:25.700	2016-08-19 10:41:25.727	0X00000000050000001A00730070005F006500780065006300750074006500730071006C00AA00000082001800E7206E0076006100720063006800610072002800360036002900840000000A0055005000440041005400450020005B00640062006F005D002E00	RPC:Completed
19 авг 16, 11:18    [19562403]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить