반응형
열이 수정된 경우에만 SQL 업데이트 트리거
다른 예를 보면, 다음과 같은 것이 떠올랐습니다만, 마음에 드는 대로 동작하지 않는 것 같습니다.수정된 정보만 업데이트하고 싶다.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
질문에는 두 가지 방법이 있습니다.
1- 트리거에서 Update 명령을 사용합니다.
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
및 세트QtyToRepair
열에서 새 값으로 새 값이 하나 또는 여러 행의 이전 값과 동일한 경우 솔루션 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]
ON [dbo].[M_ContractDT1]
AFTER UPDATE
AS
BEGIN
-- on ContarctDT1 PhyQty is updated
-- I want system date in Phytate automatically saved
SET NOCOUNT ON;
declare @dt1ky as int
if(update(Phyqty))
begin
select @dt1ky = dt1ky from deleted
update M_ContractDT1 set PhyDate=GETDATE() where Dt1Ky= @dt1ky
end
END
잘 동작합니다.
언급URL : https://stackoverflow.com/questions/12137102/sql-update-trigger-only-when-column-is-modified
반응형
'programing' 카테고리의 다른 글
nodemon이 작동하지 않음: -syslog: nodemon: 명령을 찾을 수 없습니다. (0) | 2023.04.20 |
---|---|
VBA(excel)의 행을 루프하는 가장 효율적이고 빠른 방법은 무엇입니까? (0) | 2023.04.20 |
모든 WPF 파일의 xmlns란 무엇입니까? (0) | 2023.04.20 |
용기 바닥에 div를 배치하려면 어떻게 해야 합니까? (0) | 2023.04.20 |
Swift 기반 애플리케이션은 OS X 10.9/iOS 7 이하에서 작동합니까? (0) | 2023.04.20 |