数码资讯
SQL24监控表的变更
有时,我们需要在重要的时间段监视表的变化,包括插入、更新和删除。例如,当我们将数据导出到外部系统时,我们希望导出所有数据,最好是在上一次导出之后更改的数据导出。 作为DBA,我们可以使用传统的触发器操作来构建元数据表或时间戳列来监视数据中的更改。 代码如下:代码清单1 该代码是通过SQL 2005测
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
有时,我们需要在重要的时间段监视表的变化,包括插入、更新和删除。例如,当我们将数据导出到外部系统时,我们希望导出所有数据,最好是在上一次导出之后更改的数据导出。
作为DBA,我们可以使用传统的触发器操作来构建元数据表或时间戳列来监视数据中的更改。
代码如下:代码清单1
该代码是通过SQL 2005测试(SP3),SQL Server 2008 R2(RTM CU5)
复制代码代码如下所示:
-------------------
方法1:触发器
-------------------
——基表定义
如果object_id('checksumtest,U)是无效的checksumtest表
去
创建表checksumtest
(
id int(1,1)不是null主键,
VC1 varchar(1)不为空,
2 varchar(1)不为空
)
去
插入dbo.checksumtest(VC1、VC2)select'a,B
插入dbo.checksumtest(VC1、VC2)select'b ',' '
去
——创建审核汇总表以保存元数据
如果object_id('dbo。tableauditsummary,U)是无效的dbo.tableauditsummary表
创建表dbo.tableauditsummary
id(1,1)不是null主键,
举例非空表,
最后更新日期不为空,
lastexport日期不为空
)
去
插入dbo.tableauditsummary(TableName、最后更新时间、LastExport)值('dbo。checksumtest,getdate(),getdate())
去
——需要出口的表
SELECT * FROM dbo.tableauditsummary哪里lastexport lastUpdate >
——Create Trigger在所有基表上
这火灾对任何插入/更新/删除和写入新的最后更新列
如果object_id('dbo。trg_checksumtest_maintainauditsummary,TR的)不为空dbo.trg_checksumtest_maintainauditsummary删除触发器
去
创建触发器dbo.trg_checksumtest_maintainauditsummary
在dbo.checksumtest
插入、更新、删除后
作为
开始
如果(object_id('dbo。checksumtest)不为空)
更新dbo.tableauditsummary lastUpdate = getdate(),设置字段= 'dbo checksumtest。
结束
去
——更新
更新dbo.checksumtest集VC1 = B,VC2 = 'a' id是1
更新dbo.checksumtest集VC1 = 'a',VC2 = B id是2
——检查元数据
SELECT * FROM dbo.tableauditsummary哪里lastexport lastUpdate >
-当我们导出数据时,我们运行以下操作来重置
更新dbo.tableauditsummary集lastexport = getdate(),lastexport lastUpdate >
最近我读了关于SQL Server联机帮助(BOL)的相关知识,我到SQL Server联系(校验和),binary_checksum(),和(checksum_agg)这些功能,这些功能都不是那么突然,你也可以监测数据表中的变化,并checksum_agg事实()函数尽管被称为变化的检查表,但这是不适用的。
使用校验和()和()函数checksum_agg
checksum_agg()函数在联机丛书和许多相关的网站描述。它通常用于检测表中的数据更改。这是一种更好的替换触发器的方法,它只会导致表扫描操作,所以这次我仍然使用元数据跟踪数据的变化。我建立了一个柱lastchksum代替最后更新时间,这是用来保存checksum_agg(binary_checksum(*))。它将在整个表中产生一个唯一的值来区分数据的变化。
代码如下:清单2。
复制代码代码如下所示:
---------------------------------------------
方法2:使用校验和(不可靠)
---------------------------------------------
——基表定义
如果object_id('checksumtest,U)是无效的checksumtest表
去
创建表checksumtest
(
id int(1,1)不是null主键,
VC1 varchar(1)不为空,
2 varchar(1)不为空
)
去
插入dbo.checksumtest(VC1、VC2)select'a,B
插入dbo.checksumtest(VC1、VC2)select'b ',' '
去
——创建审核汇总表以保存元数据
如果object_id('dbo。tableauditsummary,U)是无效的dbo.tableauditsummary表
创建表dbo.tableauditsummary
id(1,1)不是null主键,
举例非空表,
lastchksum INT NOT NULL
)
去
插入dbo.tableauditsummary(TableName、lastchksum)
select'dbo。checksumtest ',checksum_agg(binary_checksum(*))从dbo.checksumtest
去
——需要出口的表
SELECT * FROM dbo.tableauditsummary TableName = 'dbo checksumtest的地方。
LastChkSum < >(选择checksum_agg(binary_checksum(*))由dbo。checksumtest)
联盟的所有
…
——做一个简单的(单行更新)
更新dbo.checksumtest集VC1 = C,VC2 = 'a' id是1
——需要出口的表
SELECT * FROM dbo.tableauditsummary TableName = 'dbo checksumtest的地方。
LastChkSum < >(选择checksum_agg(binary_checksum(*))由dbo。checksumtest)
联盟的所有
…
——复位元数据
更新dbo.tableauditsummary集lastchksum =(选择checksum_agg(binary_checksum(*))由dbo。checksumtest)
哪里是= 'dbo checksumtest。
--做出对称的改变
更新dbo.checksumtest集VC1 = B,VC2 = 'a' id是1
更新dbo.checksumtest集VC1 = C,VC2 = 'a' id是2
这需要导出表(如checksum_agg没有返回任何行()没有改变!)
SELECT * FROM dbo.tableauditsummary TableName = 'dbo checksumtest的地方。
LastChkSum < >(选择checksum_agg(binary_checksum(*))由dbo。checksumtest)
联盟allcode清单2
正如你所看到的,是一个单一的校验和变的更好,但checksum_agg()不响应数据中的变化。
代码如下:代码清单3
复制代码代码如下所示:
——基表定义
如果object_id('checksumtest,U)是无效的checksumtest表
去
创建表checksumtest
(
id int(1,1)不是null主键,
VC1 varchar(1)不为空,
2 varchar(1)不为空,
chksum1为(校验码(ID,VC1,VC2)),
chksum2为(binary_checksum(ID,VC1,VC2))
)
去
插入dbo.checksumtest(VC1、VC2)select'a,B
插入dbo.checksumtest(VC1、VC2)select'b ',' '
去
——显示计算列和checksum_agg()值= 199555
SELECT * FROM checksumtest
选择checksum_agg(binary_checksum(*))从checksumtest
——做一个简单的(单行更新)
更新dbo.checksumtest集VC1 = C,VC2 = 'a' id是1
——显示计算列和checksum_agg()值= 204816(OK)
SELECT * FROM checksumtest
选择checksum_agg(binary_checksum(*))从checksumtest
--做出对称的改变
更新dbo.checksumtest集VC1 = B,VC2 = 'a' id是1
更新dbo.checksumtest集VC1 = C,VC2 = 'a' id是2
——显示计算列和checksum_agg()值= 204816(不好!)
SELECT * FROM checksumtest
选择checksum_agg(binary_checksum(*))从checksumtest
我们会发现这种checksum_agg值(binary_checksum(*))之前和之后的调整都是相同的,不能区分。
结论:
虽然checksum_agg()函数是描述在监测表数据的能力的变化,这在实际的测试是不可能的。特别是,当表被修改为对称的数据,就无法监控
作者:Tyler Ning
作为DBA,我们可以使用传统的触发器操作来构建元数据表或时间戳列来监视数据中的更改。
代码如下:代码清单1
该代码是通过SQL 2005测试(SP3),SQL Server 2008 R2(RTM CU5)
复制代码代码如下所示:
-------------------
方法1:触发器
-------------------
——基表定义
如果object_id('checksumtest,U)是无效的checksumtest表
去
创建表checksumtest
(
id int(1,1)不是null主键,
VC1 varchar(1)不为空,
2 varchar(1)不为空
)
去
插入dbo.checksumtest(VC1、VC2)select'a,B
插入dbo.checksumtest(VC1、VC2)select'b ',' '
去
——创建审核汇总表以保存元数据
如果object_id('dbo。tableauditsummary,U)是无效的dbo.tableauditsummary表
创建表dbo.tableauditsummary
id(1,1)不是null主键,
举例非空表,
最后更新日期不为空,
lastexport日期不为空
)
去
插入dbo.tableauditsummary(TableName、最后更新时间、LastExport)值('dbo。checksumtest,getdate(),getdate())
去
——需要出口的表
SELECT * FROM dbo.tableauditsummary哪里lastexport lastUpdate >
——Create Trigger在所有基表上
这火灾对任何插入/更新/删除和写入新的最后更新列
如果object_id('dbo。trg_checksumtest_maintainauditsummary,TR的)不为空dbo.trg_checksumtest_maintainauditsummary删除触发器
去
创建触发器dbo.trg_checksumtest_maintainauditsummary
在dbo.checksumtest
插入、更新、删除后
作为
开始
如果(object_id('dbo。checksumtest)不为空)
更新dbo.tableauditsummary lastUpdate = getdate(),设置字段= 'dbo checksumtest。
结束
去
——更新
更新dbo.checksumtest集VC1 = B,VC2 = 'a' id是1
更新dbo.checksumtest集VC1 = 'a',VC2 = B id是2
——检查元数据
SELECT * FROM dbo.tableauditsummary哪里lastexport lastUpdate >
-当我们导出数据时,我们运行以下操作来重置
更新dbo.tableauditsummary集lastexport = getdate(),lastexport lastUpdate >
最近我读了关于SQL Server联机帮助(BOL)的相关知识,我到SQL Server联系(校验和),binary_checksum(),和(checksum_agg)这些功能,这些功能都不是那么突然,你也可以监测数据表中的变化,并checksum_agg事实()函数尽管被称为变化的检查表,但这是不适用的。
使用校验和()和()函数checksum_agg
checksum_agg()函数在联机丛书和许多相关的网站描述。它通常用于检测表中的数据更改。这是一种更好的替换触发器的方法,它只会导致表扫描操作,所以这次我仍然使用元数据跟踪数据的变化。我建立了一个柱lastchksum代替最后更新时间,这是用来保存checksum_agg(binary_checksum(*))。它将在整个表中产生一个唯一的值来区分数据的变化。
代码如下:清单2。
复制代码代码如下所示:
---------------------------------------------
方法2:使用校验和(不可靠)
---------------------------------------------
——基表定义
如果object_id('checksumtest,U)是无效的checksumtest表
去
创建表checksumtest
(
id int(1,1)不是null主键,
VC1 varchar(1)不为空,
2 varchar(1)不为空
)
去
插入dbo.checksumtest(VC1、VC2)select'a,B
插入dbo.checksumtest(VC1、VC2)select'b ',' '
去
——创建审核汇总表以保存元数据
如果object_id('dbo。tableauditsummary,U)是无效的dbo.tableauditsummary表
创建表dbo.tableauditsummary
id(1,1)不是null主键,
举例非空表,
lastchksum INT NOT NULL
)
去
插入dbo.tableauditsummary(TableName、lastchksum)
select'dbo。checksumtest ',checksum_agg(binary_checksum(*))从dbo.checksumtest
去
——需要出口的表
SELECT * FROM dbo.tableauditsummary TableName = 'dbo checksumtest的地方。
LastChkSum < >(选择checksum_agg(binary_checksum(*))由dbo。checksumtest)
联盟的所有
…
——做一个简单的(单行更新)
更新dbo.checksumtest集VC1 = C,VC2 = 'a' id是1
——需要出口的表
SELECT * FROM dbo.tableauditsummary TableName = 'dbo checksumtest的地方。
LastChkSum < >(选择checksum_agg(binary_checksum(*))由dbo。checksumtest)
联盟的所有
…
——复位元数据
更新dbo.tableauditsummary集lastchksum =(选择checksum_agg(binary_checksum(*))由dbo。checksumtest)
哪里是= 'dbo checksumtest。
--做出对称的改变
更新dbo.checksumtest集VC1 = B,VC2 = 'a' id是1
更新dbo.checksumtest集VC1 = C,VC2 = 'a' id是2
这需要导出表(如checksum_agg没有返回任何行()没有改变!)
SELECT * FROM dbo.tableauditsummary TableName = 'dbo checksumtest的地方。
LastChkSum < >(选择checksum_agg(binary_checksum(*))由dbo。checksumtest)
联盟allcode清单2
正如你所看到的,是一个单一的校验和变的更好,但checksum_agg()不响应数据中的变化。
代码如下:代码清单3
复制代码代码如下所示:
——基表定义
如果object_id('checksumtest,U)是无效的checksumtest表
去
创建表checksumtest
(
id int(1,1)不是null主键,
VC1 varchar(1)不为空,
2 varchar(1)不为空,
chksum1为(校验码(ID,VC1,VC2)),
chksum2为(binary_checksum(ID,VC1,VC2))
)
去
插入dbo.checksumtest(VC1、VC2)select'a,B
插入dbo.checksumtest(VC1、VC2)select'b ',' '
去
——显示计算列和checksum_agg()值= 199555
SELECT * FROM checksumtest
选择checksum_agg(binary_checksum(*))从checksumtest
——做一个简单的(单行更新)
更新dbo.checksumtest集VC1 = C,VC2 = 'a' id是1
——显示计算列和checksum_agg()值= 204816(OK)
SELECT * FROM checksumtest
选择checksum_agg(binary_checksum(*))从checksumtest
--做出对称的改变
更新dbo.checksumtest集VC1 = B,VC2 = 'a' id是1
更新dbo.checksumtest集VC1 = C,VC2 = 'a' id是2
——显示计算列和checksum_agg()值= 204816(不好!)
SELECT * FROM checksumtest
选择checksum_agg(binary_checksum(*))从checksumtest
我们会发现这种checksum_agg值(binary_checksum(*))之前和之后的调整都是相同的,不能区分。
结论:
虽然checksum_agg()函数是描述在监测表数据的能力的变化,这在实际的测试是不可能的。特别是,当表被修改为对称的数据,就无法监控
作者:Tyler Ning
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。