SQL update триггер только при изменении столбца
глядя на другие примеры, я придумал следующее, Но он, похоже, не работает так, как мне хотелось бы: я хочу, чтобы он обновлял только измененную информацию, если QtyToRepair
значение было обновлено... но этого не происходит.
Если я закомментирую, где тогда измененная информация обновляется в каждом случае. Как я уже сказал, другие примеры заставили меня быть оптимистом. Любые подсказки оценены. Спасибо.
Уолтер
ALTER TRIGGER [dbo].[tr_SCHEDULE_Modified]
ON [dbo].[SCHEDULE]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
UPDATE SCHEDULE SET modified = GETDATE()
, ModifiedUser = SUSER_NAME()
, ModifiedHost = HOST_NAME()
FROM SCHEDULE S
INNER JOIN Inserted I on S.OrderNo = I.OrderNo and S.PartNumber = I.PartNumber
WHERE S.QtyToRepair <> I.QtyToRepair
END
5 ответов:
у вас есть два пути на ваш вопрос :
1-используйте команду обновления в триггере.
ALTER TRIGGER [dbo].[tr_SCHEDULE_Modified] ON [dbo].[SCHEDULE] AFTER UPDATE AS BEGIN SET NOCOUNT ON; IF UPDATE (QtyToRepair) BEGIN UPDATE SCHEDULE SET modified = GETDATE() , ModifiedUser = SUSER_NAME() , ModifiedHost = HOST_NAME() FROM SCHEDULE S INNER JOIN Inserted I ON S.OrderNo = I.OrderNo and S.PartNumber = I.PartNumber WHERE S.QtyToRepair <> I.QtyToRepair END END
2-используйте соединение между вставленной таблицей и удаленной таблицей
ALTER TRIGGER [dbo].[tr_SCHEDULE_Modified] ON [dbo].[SCHEDULE] AFTER UPDATE AS BEGIN SET NOCOUNT ON; UPDATE SCHEDULE SET modified = GETDATE() , ModifiedUser = SUSER_NAME() , ModifiedHost = HOST_NAME() FROM SCHEDULE S INNER JOIN Inserted I ON S.OrderNo = I.OrderNo and S.PartNumber = I.PartNumber INNER JOIN Deleted D ON S.OrderNo = D.OrderNo and S.PartNumber = D.PartNumber WHERE S.QtyToRepair <> I.QtyToRepair AND D.QtyToRepair <> I.QtyToRepair END
при использовании команды Update для таблицы
SCHEDULE
и setQtyToRepair
столбец для нового значения, если новое значение равно старому значению в одной или нескольких строках, Решение 1 обновляет все обновленные строки в таблице расписания, но решение 2 обновляет только строки расписания, которые старое значение не равно новому значению.
fyi код, который я получил:
IF UPDATE (QtyToRepair) begin INSERT INTO tmpQtyToRepairChanges (OrderNo, PartNumber, ModifiedDate, ModifiedUser, ModifiedHost, QtyToRepairOld, QtyToRepairNew) SELECT S.OrderNo, S.PartNumber, GETDATE(), SUSER_NAME(), HOST_NAME(), D.QtyToRepair, I.QtyToRepair FROM SCHEDULE S INNER JOIN Inserted I ON S.OrderNo = I.OrderNo and S.PartNumber = I.PartNumber INNER JOIN Deleted D ON S.OrderNo = D.OrderNo and S.PartNumber = D.PartNumber WHERE I.QtyToRepair <> D.QtyToRepair end
нужно проверить, если
QtyToRepair
сначала обновляется.ALTER TRIGGER [dbo].[tr_SCHEDULE_Modified] ON [dbo].[SCHEDULE] AFTER UPDATE AS BEGIN SET NOCOUNT ON; IF UPDATE (QtyToRepair) BEGIN UPDATE SCHEDULE SET modified = GETDATE() , ModifiedUser = SUSER_NAME() , ModifiedHost = HOST_NAME() FROM SCHEDULE S INNER JOIN Inserted I ON S.OrderNo = I.OrderNo and S.PartNumber = I.PartNumber WHERE S.QtyToRepair <> I.QtyToRepair END END
вы хотите сделать следующее:
ALTER TRIGGER [dbo].[tr_SCHEDULE_Modified] ON [dbo].[SCHEDULE] AFTER UPDATE AS BEGIN SET NOCOUNT ON; IF (UPDATE(QtyToRepair)) BEGIN UPDATE SCHEDULE SET modified = GETDATE() , ModifiedUser = SUSER_NAME() , ModifiedHost = HOST_NAME() FROM SCHEDULE S INNER JOIN Inserted I ON S.OrderNo = I.OrderNo AND S.PartNumber = I.PartNumber WHERE S.QtyToRepair <> I.QtyToRepair END END
обратите внимание, что этот триггер будет срабатывать каждый раз при обновлении столбца независимо от того, является ли значение одинаковым или нет.
Я получил самое простое мышление концепция всякий раз, когда запись обновляется запись удаляется.
вот мой пример
ALTER TRIGGER [dbo].[UpdatePhyDate] На на [dbo].[M_ContractDT1] ПОСЛЕ ОБНОВЛЕНИЯ КАК НАЧИНАТЬ -- на ContarctDT1 PhyQty обновляется -- Я хочу, чтобы системная дата в фитат автоматически сохраняются УСТАНОВИТЕ NOCOUNT НА;
declare @dt1ky as int if(update(Phyqty)) begin select @dt1ky = dt1ky from deleted update M_ContractDT1 set PhyDate=GETDATE() where Dt1Ky= @dt1ky end
конец
Он работает