在这篇文章中
我们将讨论利用Data Dude来进行数据比较
Data Dude
正式叫法是Visual Studio Team Edition for Database Professionals
是一个面对数据库开发人员的IDE
能让其对数据库结构如何和何时改变进行更多控制
让我们先来看一下什么是
数据比较
数据比较是对两个数据库中的数据进行比较并将目标数据库更新的行为像模式比较一下这也有源和目标的概念比较时我们可以看到不同的地方并能够按照我们的想法更新目标数据库我们先来执行一个简单的比较来看看数据比较是如何使用的同时也可以知道它对我们是很有用的
第一步创建一个数据库工程我们需要两个同模式的数据库用来比较数据在前面的文章中我已经提到过如何创建工程模型这里就不重复介绍了只需要简单地按照如下几个步骤来做
· 打开SQL Server商业智能开发工具并创建一个SQL Server 数据库工程我们不需要向工程中载入模式因此我们没有必要使用SQL Server 向导
· 使用数据库AdventureWorks作为我们比较时的源数据库我们还需要一个同模式的目标数据库我们可以将AdventureWorks数据库复制现在请打开SQL Server管理工具
· 备份AdventureWorks数据库并将之另存为AdventureWorksTemp
· 回到BIDS中的工程尽管两个数据库之间没有不同我们仍可以看看执行数据比较的方法点击数据>数据比较>新数据比较菜单项
· 弹出新数据比较窗口如下所示
我们需要把数据库AdventureWorks设为源如果下拉菜单中包含该选项则直接选择它否则需要点击新建连接按钮创建一个新的连接然后选择该连接
· 将数据库AdventureWorksTemp设为目标库如果下来菜单中没有创建并选择它
· 在屏幕上有个数据比较选项
o 不同记录: 选择该选项将显示两个数据库中不同的记录并且目标库中的记录将被更新
o 源记录: 选择该选项将显示源库中有而目标库中没有的记录这些记录将被插入到目标库中
o 目标记录: 选择该选项将显示那些只在目标库中有而源库中没有的记录这些记录将从目标库中删除
o 相同记录: 选择该选项将显示那些源和目标库中相似的记录对这些记录将不会做任何操作
· 选中所有的多选框点击下一步继续
· 弹出如下所示的窗口
在这个窗口中我们可以选择我们想要进行数据比较的对象如果你想要排除任何对象将表点开取消你想要排除的项目点击完成按钮开始比较
比较的结果如下所示
比较结果窗口包含三部分但默认情况下我们只能看到部分第一部分显示了被选中的每个对象及该对象在各个类型下的记录数例如结果显示在个数据库的dboDatabaseLog中有条相同记录因为被选择的个数据库完全相同所以我们除了在相同记录中看到有值之外其他列都没有值
第二部分显示与选择行(对象)相关的信息她是一个带标签的表有个标签每个标签代表第一部分的一列不同记录这个标签下的表格有两列分别代表源和目标库中的数据列其它标签下的表格都是单一列如果点击相同记录标签你将看到选择对象的所有记录
因为目标库中没有数据需要更新所以个按钮写入更新和导出到编辑器都是不可用的这两个按钮主要用来更新目标数据库写入更新按钮表示直接更新数据库而导出到编辑器则是将更新的脚本导出到独立的编辑器中以方便修改和执行
经上所述我们已经熟悉了做数据比较的方法接下来我们继续讨论看看那些修改是如何通过数据比较功能被反应出来的
比较键
为了进行数据比较Data Dude需要一个拥有唯一值的列如果表中没有这样的唯一键它就不会被列入第二部分的新数据比较也就不会被列入比较的行列所以请务必记得一个唯一的键是数据比较所必需的
如果一个表拥有不止一个的唯一键这些键都会在比较键的下拉菜单中显示出来Data Dude会自动选择第一个键作为比较的主键但你也可以按照你的要求自己选择下面的脚本将在个数据库中创建一个表并说明结果是如何在第二部分显示的
以下是引用片段
useAdventureWorks
go
createtableTestTable(ColumnintprimarykeynotnullColumnvarchar())
go
createuniqueindexIX_TestTableonTestTable(Column)
go
insertintoTestTablevalues(Value)
insertintoTestTablevalues(Value)
go
useAdventureWorksTemp
go
createtableTestTable(ColumnintprimarykeynotnullColumnvarchar())
go
createuniqueindexIX_TestTableonTestTable(Column)
go
一旦执行脚本开始一个新的数据比较结果将在第二部分显示如下
图中显示了主键和唯一键
我不能确定改变比较键是否能影响操作或者性能
但是我知道
选择聚簇索引能提高数据比较的性能
反应数据修改
现在我们来修改一下两个数据库中的数据然后看看这些改变是如何被表示出来的修改数据的脚本语句如下使用Data Dude执行脚本的步骤如下
· 打开管理工具并新开一个查询窗口
· 运行下面的脚本
USEAdventureWorks
GO
UPDATESalesSalesOrderDetail
SETOrderQty=
WHERESalesOrderDetailID=
GO
USEAdventureWorksTemp
GO
INSERTPersonContactType
(Name)VALUES(AssistantAccountManager)
· 打开我们创建的工程
开始一个新的数据比较
· 选择数据库 AdventureWorks 作为源数据库 AdventureWorksTemp 作为目标 点击完成开始比较
· 分析比较结果我们可以看到PersonContactType表的第一个不同之处结果显示值说明有一条记录是目标记录建议从目标库中删除掉这个记录
结果显示第二处修改在于表 SalesSalesOrderDetail 中尽管我们只改变了表SalesSalesOrderDetail中的记录 但是表上的触发器却同时更新了表SalesSalesOrderHeader 和表ProductionTransactionHistory
这些修改将被作为更新要求应用到目标库
写入更新和导出到编辑器按钮现在变为可用状态 点击导出到编辑器按钮分析产生的脚本脚本如下
DROPCONSTRAINTandCREATECONSTRAINTstatementsforallforeignkeys
DELETEstatementforPersonContactTypetable
UPDATEstatementforSalesSalesOrderDetailandSalesSalesOrderHeadertables
INSERTstatementforProductionTransactionHistorytable
返回到数据比较标签
点击
写入更新
更新目标数据库
查询相应的表看看目标库中的记录是否被更新
是不是任何记录都按照源数据库更新了呢?查看数据比较窗口顶部的消息上面显示X条记录被比较和更新了为了确保每一条记录都被更新我们再次比较一下点击数据比较工具条中的刷新图标开始重新比较现在所有的记录都是相同的吗?你会看到在表Order中仍然有数据不匹配现在我们来查找一下不匹配的原因原来是ModifiedDate列出了问题我们再次更新目标库点击写入更新按钮来执行更新刷新再比较仍然不是所有的记录都匹配?是的因为表SalesSalesOrderDetails上设置的触发器这种现象将一直继续一旦执行更新操作触发器被激发并更新了ModifiedDate列和SalesSalesOrderHeader表点击关闭触发器按钮触发器操作将被阻止
数据比较选项
点击数据库工具>数据比较会显示出首选项窗口(工具>选项)其中有个选项可以不同程度的改变更新的进程激活或者关闭这些选项可以灵活的按照你的要求来控制更新下面分别对这个选项做简单介绍
关闭外键
这个选项默认情况下是激活的所以我们能够在脚本中看到所有外键的删除和重新创建的语句当更新和删除记录时激活该选项会在执行时停止检查外键的可用性而关闭该选项则会强迫检查外键的可用性
关闭触发器
激活该选项将会阻止激活触发器 如果在执行前面的更新操作时激活了该选项我们就不会看到不匹配的记录你可以在激活该选项的情况下再执行以下前面的操作看看结果
删除主键
索引和唯一性约束
一旦你激活了该选项在比较时会删除掉所有的主键所有的索引和所有的唯一性约束但我曾没有遇到过删除主键和聚簇索引的脚本如果你要更新一个表而这个表数据量很大而且拥有很沉重的索引那么删除索引是一个很好的选择
包含时间戳列
该选项默认是开着的当它开着的时候会比较时间戳列并显示时间戳是否有差异但它不会更新目标库也不会产生更新的脚本关闭该选项将不会比较时间戳
不使用事务
激活这个选项将阻止脚本在事务中执行默认情况下它是激活的
排除表示列 默认情况下
该选项是关闭的
因此会比较标识列的值
当激活该选项的时候
表示列的值不会被比较
也不会显示该列的不同之处
但我发现
当表示列是主键的一部分时
即使该选项被激活
也会比较标识列
消除尾部空格
激活该选项会在更新目标库的时候删除列中尾部的空格
希望到此为止我已经介绍得比较充分而你们也能发现数据比较非常有用如果你还没有使用这项功能可以下载试用