怎么知道行sql server有什么变化?

时间:2014-04-23 07:33:13

标签: sql sql-server sql-server-2008 tsql

我有这样的数据

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

无论如何要知道特定departmentid任何列的值已被更改? (不想使用时间戳)

由于

5 个答案:

答案 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)

  1. 为数据类型(位)添加一列,以便更新行。
  2. 在你的桌子上触发,如下所示。

    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值进行比较,看它是否匹配。如果它不匹配,您知道它已更改,然后进行操作并更新校验和列。