首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何知道行sql服务器中是否有任何更改?

如何知道行sql服务器中是否有任何更改?
EN

Stack Overflow用户
提问于 2014-04-23 15:33:13
回答 5查看 66关注 0票数 0

我有这样的数据

代码语言:javascript
复制
DeptId    DeptName    DeptHeadId    DeptBudget
----------------------------------------------
1         HR          1             100000
2         HR-1        2             200000
3         HR-2        5             300000

有没有办法知道在特定的departmentid上是否有任何列的值发生了更改?(不希望使用时间戳)

谢谢

EN

回答 5

Stack Overflow用户

发布于 2014-04-23 16:09:25

示例表和数据

代码语言:javascript
复制
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:

代码语言:javascript
复制
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

测试触发器:

代码语言:javascript
复制
UPDATE mytable 
SET DeptName = 'HR-0' 
WHERE deptid = 1

结果

代码语言:javascript
复制
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

在下次更新检查前重置

代码语言:javascript
复制
UPDATE mytable
SET HasBeenUpdated = 0 
WHERE HasBeenUpdated = 1
票数 1
EN

Stack Overflow用户

发布于 2014-04-23 15:41:18

SQL Server 2008及更高版本支持更改跟踪。我自己没有用过它,但我相信它可以做你想要的事情,而不需要使用时间戳字段。参见TechNet here

票数 0
EN

Stack Overflow用户

发布于 2014-04-23 16:01:36

您可以使用AFTER UPDATE触发器并使用IF UPDATE指定列,如下所示:

代码语言:javascript
复制
    ....
    AFTER UPDATE
    AS 
    BEGIN

    IF ( UPDATE (DeptName) OR UPDATE (DeptBudget) )
    ....
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23237769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档