行级和列级跟踪
更改跟踪使应用程序能够跟踪用户所做的所有更改,这是一种内置方法
enter link description here
SQL Server 更改跟踪确定列是否更改,因此我决定在 2008 R2 中使用以下脚本进行尝试。基本上在最后一个更新语句中,我将列更新为列中已经存在的相同值。 SQL 似乎只是记录该列涉及更新语句。不幸的是,这意味着任何想要在列级别执行同步操作的人都必须编写更复杂的行更新逻辑。
CREATE TABLE [dbo].[Test](
[Id] [int] IDENTITY(1,1) NOT NULL,
[A] [varchar](50) NULL,
[B] [int] NULL
CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER DATABASE TrackingTest
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON)
ALTER TABLE TrackingTest.dbo.Test
ENABLE CHANGE_TRACKING
WITH (TRACK_COLUMNS_UPDATED = ON);
GO
INSERT INTO dbo.Test (A,B) VALUES ('C', 50)
INSERT INTO dbo.Test (A,B) VALUES ('D', 50)
SELECT 'SYS_CHANGE_COLUMS = NULL means that all columns changed.'
SELECT
CT.Id, CT.SYS_CHANGE_OPERATION,
CT.SYS_CHANGE_COLUMNS, CT.SYS_CHANGE_CONTEXT,
CHANGE_TRACKING_IS_COLUMN_IN_MASK (COLUMNPROPERTY(OBJECT_ID('dbo.Test'), 'A', 'ColumnId'),CT.SYS_CHANGE_COLUMNS) AS A_CHANGED,
CHANGE_TRACKING_IS_COLUMN_IN_MASK (COLUMNPROPERTY(OBJECT_ID('dbo.Test'), 'B', 'ColumnId'),CT.SYS_CHANGE_COLUMNS) AS B_CHANGED
FROM
CHANGETABLE(CHANGES dbo.Test, NULL) AS CT
DECLARE @synchronization_version BIGINT
SET @synchronization_version = CHANGE_TRACKING_CURRENT_VERSION();
SELECT * FROM dbo.Test
SELECT 'Changing both columns via "UPDATE dbo.Test SET A=''E'', B=51"'
UPDATE dbo.Test SET A='E', B=51
SELECT * FROM dbo.Test
SELECT
CT.Id, CT.SYS_CHANGE_OPERATION,
CT.SYS_CHANGE_COLUMNS, CT.SYS_CHANGE_CONTEXT,
CHANGE_TRACKING_IS_COLUMN_IN_MASK (COLUMNPROPERTY(OBJECT_ID('dbo.Test'), 'A', 'ColumnId'),CT.SYS_CHANGE_COLUMNS) AS A_CHANGED,
CHANGE_TRACKING_IS_COLUMN_IN_MASK (COLUMNPROPERTY(OBJECT_ID('dbo.Test'), 'B', 'ColumnId'),CT.SYS_CHANGE_COLUMNS) AS B_CHANGED
FROM
CHANGETABLE(CHANGES dbo.Test, @synchronization_version) AS CT
SET @synchronization_version = CHANGE_TRACKING_CURRENT_VERSION();
SELECT * FROM dbo.Test
SELECT 'Only setting column A to the value already in the column via "UPDATE dbo.Test SET A=''E''"'
UPDATE dbo.Test SET A='E'
SELECT * FROM dbo.Test
SELECT 'Now SYS_CHANGE_COLUMS has a value showing that only A was changed'
SELECT 'To bad it isn''t smart enough to know that the data did not change!'
SELECT
CT.Id, CT.SYS_CHANGE_OPERATION,
CT.SYS_CHANGE_COLUMNS, CT.SYS_CHANGE_CONTEXT,
CHANGE_TRACKING_IS_COLUMN_IN_MASK (COLUMNPROPERTY(OBJECT_ID('dbo.Test'), 'A', 'ColumnId'),CT.SYS_CHANGE_COLUMNS) AS A_CHANGED,
CHANGE_TRACKING_IS_COLUMN_IN_MASK (COLUMNPROPERTY(OBJECT_ID('dbo.Test'), 'B', 'ColumnId'),CT.SYS_CHANGE_COLUMNS) AS B_CHANGED
FROM
CHANGETABLE(CHANGES dbo.Test, @synchronization_version) AS CT
Results are: