2014-04-23 52 views
0

我有這樣如何知道行sql server中有任何更改?

DeptId DeptName DeptHeadId DeptBudget 
---------------------------------------------- 
1   HR   1    100000 
2   HR-1  2    200000 
3   HR-2  5    300000 

數據有反正知道具體departmentid任何列的值已經改變? (不想使用時間戳)

謝謝

+3

如何更新觸發器? – samar

+0

你想在發生變化時檢測到變化嗎?或者知道歷史的變化(如果是這樣,比較點是什麼,我們怎麼知道這一點?) –

回答

0

SQL Server 2008及更高版本支持更改跟蹤。我沒有使用它自己,但我相信它沒有使用時間戳字段就是你想要的。請參閱TechNet here

0

您可以使用AFTER UPDATE觸發器,並指定與IF UPDATE列,就像這樣:

.... 
    AFTER UPDATE 
    AS 
    BEGIN 

    IF (UPDATE (DeptName) OR UPDATE (DeptBudget)) 
    .... 
1

示例表和數據

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 
0
  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被更新的行。

0

您可以將Checksum(DeptName,DeptHeadId,DeptBudget)存儲在表中,然後將其與當前Checksum值進行比較以查看它是否匹配。如果它不匹配,則知道它已更改,然後執行操作並更新校驗和列。

相關問題