Определить, пришла ли вставка / обновление из другого триггера?

#sql-server #triggers

#sql-server #триггеры

Вопрос:

У меня есть таблица1, которая обновляется и вставляется с данными через sp.

обновление выполняется для каждого идентификатора строки (не для массового обновления) — я имею в виду — Single update .

В этой таблице есть триггер Tg1, который обновляет некоторые поля в той же записи, которая была обновлена . (после обновления записи в db — TG1 обновляет некоторые из ее полей)

 I DONT HAVE ACCESS to TG1 !.
 

В этой таблице есть другой триггер, который я построил Tg2.
какой архив исходной вставленной записи через SELECT * FROM DELETED ... and insert to table Archive...

проблема в том, что Tg2 улавливает also события для TG1! (он вставляет в архивную таблицу 3 записи вместо 1.

Вопрос: Есть ли в любом случае (в TG2) информация о том, что действие было получено из Tg1? (таким образом, я мог бы избежать этих событий, поскольку мне нужны только события, которые пришли из моего sp.)

Как я могу это решить? (у меня нет доступа к tg1 …)

Комментарии:

1. Ваша первая проблема заключается в том, что триггер никогда не должен записываться в предположении, что будет вставлена / удалена / изменена только одна строка.

2. @HLGEM, как я могу это решить?

3. Чтобы ответить на этот вопрос, мне нужно было бы увидеть сам триггер, однако вы не должны ничего устанавливать в скалярную переменную, вместо этого используйте statments на основе set. И тестируйте как с обновлением одной записи, так и с обновлением нескольких записей.

Ответ №1:

Почему вы не хотите архивировать запись в том виде, в каком она, наконец, существует в таблице?

Однако вы можете установить порядок срабатывания вашего триггера таким, чтобы он был первым, используя sp_settriggerorder . Посмотрите в книгах онлайн, как это сделать.

Комментарии:

1. Большое вам спасибо, я буду искать часть заказа. p.s.: резервная копия в другую таблицу предназначена для управления версиями… им нужны моментальные снимки за раз: goto 1 year before - and tell me what the same record was looked like ….