IF UPDATE() при запуске SQL-сервера
Если есть:
IF UPDATE (col1)
... в триггере SQL-сервера в таблице, возвращает ли он true только в том случае, если col1 был изменен или обновлен?
У меня есть регулярный запрос на обновление, например
UPDATE table-name
SET col1 = 'x',
col2 = 'y'
WHERE id = 999
Теперь, о чем я говорю, если "col1" был "x" ранее, мы снова обновили его до "x",
был бы IF UPDATE ("col1")
trigger return True или нет?
Я столкнулся с этой проблемой, так как мой запрос сохранения является общим для всех столбцов, но когда я добавляю это условие, он возвращает True, даже если он не изменился... Поэтому я обеспокоен тем, что делать в этом случае, если я хочу добавить такое состояние?
Ответы
Ответ 1
Возвращает true, если столбец был обновлен. Обновление означает, что в запросе установлено значение столбца. Было ли предыдущее значение таким же, как новое значение, в значительной степени релевантным.
UPDATE table SET col = col
это обновление.
UPDATE table SET col = 99
когда у col уже было значение 99, это также обновление.
Ответ 2
Внутри триггера у вас есть доступ к двум внутренним таблицам, которые могут помочь. Таблица "вставлена" включает в себя новую версию каждой затронутой строки. В таблицу "deleted" включена исходная версия каждой строки. Вы можете сравнить значения в этих таблицах, чтобы увидеть, действительно ли ваше значение поля было изменено.
Ответ 3
Что вы делаете, так это проверять разные значения во вставленных и удаленных таблицах, а не использовать обновленные() (не забудьте указать нули). Или вы можете перестать делать ненужные обновления.
Ответ 4
Вот быстрый способ сканирования строк, чтобы увидеть, изменился ли какой-либо столбец, прежде чем принять решение о запуске содержимого триггера. Это может быть полезно, например, когда вы хотите записать запись истории, но вы не хотите этого делать, если ничего не изменилось.
Мы постоянно используем это в процессах импорта ETL, где мы можем повторно импортировать данные, но если в исходном файле ничего не изменилось, мы не хотим создавать новую историю.
CREATE TRIGGER [dbo].[TR_my_table_create_history]
ON [dbo].[my_table] FOR UPDATE AS
BEGIN
--
-- Insert the old data row if any column data changed
--
INSERT INTO [my_table_history]
SELECT d.*
FROM deleted d
INNER JOIN inserted i ON i.[id] = d.[id]
--
-- Use INTERSECT to see if anything REALLY changed
--
WHERE NOT EXISTS( SELECT i.* INTERSECT SELECT d.* )
END
Обратите внимание, что этот конкретный триггер предполагает, что ваша исходная таблица (одна из которых запускает триггер) и таблицу истории имеют одинаковые макеты столбцов.
Ответ 5
Чтобы создать ярлык для случая "Нет актуального обновления", вам нужно также проверить, был ли ваш запрос затронут любые строки:
set nocount on; -- this must be the first statement!
if not exists (select 1 from inserted) and not exists (select 1 from deleted)
return;
Ответ 6
SET NOCOUNT ON;
declare @countTemp int
select @countTemp = Count (*) from (
select City,PostCode,Street,CountryId,Address1 from Deleted
union
select City,PostCode,Street,CountryId,Address1 from Inserted
) tempTable
IF ( @countTemp > 1 )
Begin
-- Your Code goes Here
End
-- if any of these "City,PostCode,Street,CountryId,Address1" got updated then trigger
-- will work in " IF ( @countTemp > 1 ) " Code)
Ответ 7
cREATE TRIGGER boo ON status2 FOR UPDATE AS
IF UPDATE (id)
BEGIN
SELECT 'DETECT';
END;
UPDATE status2 SET name = 'K' WHERE name= 'T' --no action
UPDATE status2 SET name = 'T' ,id= 8 WHERE name= 'K' --detect
Ответ 8
Это сработало для меня
DECLARE @LongDescDirty bit = 0
Declare @old varchar(4000) = (SELECT LongDescription from deleted)
Declare @new varchar(4000) = (SELECT LongDescription from inserted)
if (@old <> @new)
BEGIN
SET @LongDescDirty = 1
END
Update table
Set LongDescUpdated = @LongDescUpdated
.....