使用数据库中所有表的校验和创建表?

时间:2016-04-13 14:33:27

标签: sql sql-server

我试图弄清楚如何确定某个表是否受到顺序运行的多个进程的影响,并且需要知道每次运行之前和之后表的状态。我一直尝试做的是在所有进程运行之前运行一些SQL,它将db中每个表的校验和保存到表中,然后在每个表结束时再次运行它并使用after checksum更新表行。在所有过程结束后,我比较校验和并获得所有行之前<>后。

唯一的问题是我不是SQL的最佳人选,而且有点迷失。我现在就在这里:

select checksum_agg(binary_checksum(*)) from empcomp with (nolock)

create table Test_CheckSum_Record ( TableName varchar(max), CheckSum_Before int, CheckSum_After int)


SELECT name into #TempNames
FROM sys.Tables where is_ms_shipped = 0

我想要做的伪代码就像

foreach(var name in #TempNames)
insert into Test_CheckSum_Record(name, ExecuteSQL N'select checksum_agg(binary_checksum(*)) from ' + name + ' with (nolock)', null)

但是如何做到这一点?

1 个答案:

答案 0 :(得分:0)

根据评论判断,您需要创建一个触发器来处理所有CRUD操作并只放置一个标志

语法是

Create TRIGGER [TriggerName] ON [TableName]
AFTER UPDATE, AFTER Delete, AFTER UPDATE

在触发器中你可以做

select CHECKSUM_AGG([Columns you want to compare against]) from [ParentTable]将该值存储在变量中,并在列之前根据校验和表进行检查。如果它不存在,则添加一个新条目,其中DELETED表checksum_AGG值为前一个条目

请注意,选择不使用插入的表格只是我对计算列的偏好

稍后当我有更多时间添加代码时,我会进行编辑