Подтвердить что ты не робот

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, даже если он не изменился... Поэтому я обеспокоен тем, что делать в этом случае, если я хочу добавить такое состояние?

4b9b3361

Ответ 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

.....