我有这样的数据
DeptId DeptName DeptHeadId DeptBudget
----------------------------------------------
1 HR 1 100000
2 HR-1 2 200000
3 HR-2 5 300000有没有办法知道在特定的departmentid上是否有任何列的值发生了更改?(不希望使用时间戳)
谢谢
发布于 2014-04-23 16:09:25
示例表和数据
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发布于 2014-04-23 15:41:18
SQL Server 2008及更高版本支持更改跟踪。我自己没有用过它,但我相信它可以做你想要的事情,而不需要使用时间戳字段。参见TechNet here。
发布于 2014-04-23 16:01:36
您可以使用AFTER UPDATE触发器并使用IF UPDATE指定列,如下所示:
....
AFTER UPDATE
AS
BEGIN
IF ( UPDATE (DeptName) OR UPDATE (DeptBudget) )
....https://stackoverflow.com/questions/23237769
复制相似问题