#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
….