DeptId DeptName DeptHeadId DeptBudget
----------------------------------------------
1 HR 1 100000
2 HR-1 2 200000
3 HR-2 5 300000
數據有反正知道具體departmentid
任何列的值已經改變? (不想使用時間戳)
謝謝
DeptId DeptName DeptHeadId DeptBudget
----------------------------------------------
1 HR 1 100000
2 HR-1 2 200000
3 HR-2 5 300000
數據有反正知道具體departmentid
任何列的值已經改變? (不想使用時間戳)
謝謝
SQL Server 2008及更高版本支持更改跟蹤。我沒有使用它自己,但我相信它沒有使用時間戳字段就是你想要的。請參閱TechNet here。
您可以使用AFTER UPDATE觸發器,並指定與IF UPDATE列,就像這樣:
....
AFTER UPDATE
AS
BEGIN
IF (UPDATE (DeptName) OR UPDATE (DeptBudget))
....
示例表和數據
CREATE TABLE mytable(DeptId int identity(1,1),
DeptName varchar(100),DeptHeadId int, DeptBudget int, HasBeenUpdated bit)
INSERT mytable(DeptName,DeptHeadId, DeptBudget)
values('HR', 1,100000),
('HR-1',2,200000),
('HR-2',5,300000)
go
觸發語法,這會不會對變化作出反應HasBeenUpdated列,如果一行被「更改」爲當前值,則它不會註冊爲已更改的eather:
CREATE TRIGGER mytable_trg1
ON mytable
INSTEAD OF UPDATE
AS
MERGE mytable t1
USING
INSERTED t2
ON t1.DeptId = t2.DeptId
WHEN matched THEN
UPDATE
SET DeptName = t2.DeptName,
DeptHeadId=t2.DeptHeadId,
DeptBudget=t2.DeptBudget, HasBeenUpdated =
CASE WHEN EXISTS
(SELECT t1.DeptName, t1.DeptHeadId, t1.DeptBudget
EXCEPT
SELECT t2.DeptName, t2.DeptHeadId, t2.DeptBudget)
THEN 1 ELSE t2.HasBeenUpdated
END
;
go
測試觸發器:
UPDATE mytable
SET DeptName = 'HR-0'
WHERE deptid = 1
結果
SELECT * FROM mytable
DeptId DeptName DeptHeadId DeptBudget HasBeenUpdated
1 HR-0 1 100000 1
2 HR-1 2 200000 NULL
3 HR-2 5 300000 NULL
爲了下次更新確認
UPDATE mytable
SET HasBeenUpdated = 0
WHERE HasBeenUpdated = 1
在你的桌子上像下面一樣觸發一個觸發器。
CREATE TRIGGER dbo.trigforisupdateornot
ON dbo.triggertable
AFTER UPDATE
AS
BEGIN
if (UPDATE(DeptName) OR
UPDATE(DeptHeadId) OR
UPDATE(DeptBudget))
Begin
Update triggertable
Set IsUpdate = 1
Where Deptid = (Select deptid From inserted)
End
END
GO
更新
Select *
From triggertable
之前執行這個查詢上述查詢的輸出。
DeptId DeptName DeptHeadId DeptBudget IsUpdate
----------- ----------------------------------------- ----------- ----------- --------
1 HR 1 100000 NULL
2 HR-1 2 200000 NULL
3 HR-2 5 300000 NULL
現在執行下面的查詢來更新記錄。
Update triggertable
Set deptname = deptname
where deptid = 1
現在的輸出將是
DeptId DeptName DeptHeadId DeptBudget IsUpdate
----------- ----------------------------------------- ----------- ----------- --------
1 HR 1 100000 1
2 HR-1 2 200000 NULL
3 HR-2 5 300000 NULL
其中IsUpdate = 1被更新的行。
您可以將Checksum(DeptName,DeptHeadId,DeptBudget)存儲在表中,然後將其與當前Checksum值進行比較以查看它是否匹配。如果它不匹配,則知道它已更改,然後執行操作並更新校驗和列。
如何更新觸發器? – samar
你想在發生變化時檢測到變化嗎?或者知道歷史的變化(如果是這樣,比較點是什麼,我們怎麼知道這一點?) –