Как вы получаете список обновленных столбцов в триггере SQL-сервера? - PullRequest
8 голосов
/ 27 мая 2009

Я хочу знать, какие столбцы обновлялись во время операции обновления на триггере при первом просмотре онлайн-книг. Похоже, COLUMNS_UPDATED - идеальное решение, но эта функция на самом деле не проверяет, изменились ли значения, она проверяет только те столбцы, которые были выбраны В предложении об обновлении есть предложения?

Ответы [ 5 ]

9 голосов
/ 13 января 2012

Мы можем использовать функцию обновления, чтобы определить, обновляется ли конкретный столбец:

IF UPDATE(ColumnName)

Подробнее см. По этой ссылке: http://msdn.microsoft.com/en-us/library/ms187326.aspx

8 голосов
/ 27 мая 2009

Единственный способ проверить, изменились ли значения, - это сравнить значения в виртуальных таблицах DELETED и INSERTED в триггере. SQL не проверяет существующее значение перед обновлением до нового, оно с радостью запишет новое идентичное значение поверх - другими словами, оно берет ваше слово за обновление и отслеживает обновление, а не фактические изменения.

4 голосов
/ 27 мая 2009

Как уже сообщали другие, вам нужно будет опросить INSERTED и DELETED. Единственный полезный совет может быть в том, что вы можете получить только строки, которые изменили значения (и отбросить строки, которые не изменились), используя оператор EXCEPT - например:

SELECT * FROM Inserted
EXCEPT
SELECT * FROM Deleted
0 голосов
/ 27 мая 2009

Я задал этот же вопрос !

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

0 голосов
/ 27 мая 2009

Я могу думать только о том, что вы можете сравнить значения в DELETED и INSERTED, чтобы увидеть, какие столбцы изменились.

Хотя это не выглядит особенно элегантным решением.

...