我有这样的数据
DeptId DeptName DeptHeadId DeptBudget
----------------------------------------------
1 HR 1 100000
2 HR-1 2 200000
3 HR-2 5 300000
无论如何要知道特定departmentid
任何列的值已被更改? (不想使用时间戳)
由于
答案 0 :(得分: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列中的更改作出反应。对于当前的价值,它不会因为改变而注册:
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
答案 1 :(得分:0)
SQL Server 2008及更高版本支持更改跟踪。我自己没有使用它,但我相信它可以做你想要的而不使用时间戳字段。请参阅TechNet here。
答案 2 :(得分:0)
您可以使用AFTER UPDATE触发器并使用IF UPDATE指定列,如下所示:
....
AFTER UPDATE
AS
BEGIN
IF ( UPDATE (DeptName) OR UPDATE (DeptBudget) )
....
答案 3 :(得分:0)
在你的桌子上触发,如下所示。
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是更新行。
答案 4 :(得分:0)
您可以在表格中存储Checksum(DeptName,DeptHeadId,DeptBudget),然后将其与当前的Checksum值进行比较,看它是否匹配。如果它不匹配,您知道它已更改,然后进行操作并更新校验和列。