在這篇文章中
我們將討論利用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會自動選擇第一個鍵作為比較的主鍵但你也可以按照你的要求自己選擇下面的腳本將在個數據庫中創建一個表並說明結果是如何在第二部分顯示的
以下是引用片段
use AdventureWorks
go
create table TestTable (Column int primary key not null Column varchar())
go
create unique index IX_TestTable on TestTable (Column)
go
insert into TestTable values ( Value)
insert into TestTable values ( Value)
go
use AdventureWorksTemp
go
create table TestTable (Column int primary key not null Column varchar())
go
create unique index IX_TestTable on TestTable (Column)
go
一旦執行腳本開始一個新的數據比較結果將在第二部分顯示如下
圖中顯示了主鍵和唯一鍵
我不能確定改變比較鍵是否能影響操作或者性能
但是我知道
選擇聚簇索引能提高數據比較的性能
反應數據修改
現在我們來修改一下兩個數據庫中的數據然後看看這些改變是如何被表示出來的修改數據的腳本語句如下使用Data Dude執行腳本的步驟如下
· 打開管理工具並新開一個查詢窗口
· 運行下面的腳本
USE AdventureWorks
GO
UPDATE SalesSalesOrderDetail
SET OrderQty =
WHERE SalesOrderDetailID =
GO
USE AdventureWorksTemp
GO
INSERT PersonContactType
(Name) VALUES (Assistant Account Manager)
· 打開我們創建的工程
開始一個新的數據比較
· 選擇數據庫 AdventureWorks 作為源數據庫 AdventureWorksTemp 作為目標 點擊完成開始比較
· 分析比較結果我們可以看到PersonContactType表的第一個不同之處結果顯示值說明有一條記錄是目標記錄建議從目標庫中刪除掉這個記錄
結果顯示第二處修改在於表 SalesSalesOrderDetail 中盡管我們只改變了表SalesSalesOrderDetail中的記錄 但是表上的觸發器卻同時更新了表SalesSalesOrderHeader 和表ProductionTransactionHistory
這些修改將被作為更新要求應用到目標庫
寫入更新和導出到編輯器按鈕現在變為可用狀態 點擊導出到編輯器按鈕分析產生的腳本腳本如下
DROP CONSTRAINT and CREATE CONSTRAINT statements for all foreign keys
DELETE statement for PersonContactType table
UPDATE statement for SalesSalesOrderDetail and SalesSalesOrderHeader tables
INSERT statement for ProductionTransactionHistory table
返回到數據比較標簽
點擊
寫入更新
更新目標數據庫
查詢相應的表看看目標庫中的記錄是否被更新
是不是任何記錄都按照源數據庫更新了呢?查看數據比較窗口頂部的消息上面顯示X條記錄被比較和更新了為了確保每一條記錄都被更新我們再次比較一下點擊數據比較工具條中的刷新圖標開始重新比較現在所有的記錄都是相同的嗎?你會看到在表Order中仍然有數據不匹配現在我們來查找一下不匹配的原因原來是ModifiedDate列出了問題我們再次更新目標庫點擊寫入更新按鈕來執行更新刷新再比較仍然不是所有的記錄都匹配?是的因為表SalesSalesOrderDetails上設置的觸發器這種現象將一直繼續一旦執行更新操作觸發器被激發並更新了ModifiedDate列和SalesSalesOrderHeader表點擊關閉觸發器按鈕觸發器操作將被阻止
數據比較選項
點擊數據庫工具>數據比較會顯示出首選項窗口(工具>選項)其中有個選項可以不同程度的改變更新的進程激活或者關閉這些選項可以靈活的按照你的要求來控制更新下面分別對這個選項做簡單介紹
關閉外鍵
這個選項默認情況下是激活的所以我們能夠在腳本中看到所有外鍵的刪除和重新創建的語句當更新和刪除記錄時激活該選項會在執行時停止檢查外鍵的可用性而關閉該選項則會強迫檢查外鍵的可用性
關閉觸發器
激活該選項將會阻止激活觸發器 如果在執行前面的更新操作時激活了該選項我們就不會看到不匹配的記錄你可以在激活該選項的情況下再執行以下前面的操作看看結果
刪除主鍵
索引和唯一性約束
一旦你激活了該選項在比較時會刪除掉所有的主鍵所有的索引和所有的唯一性約束但我曾沒有遇到過刪除主鍵和聚簇索引的腳本如果你要更新一個表而這個表數據量很大而且擁有很沉重的索引那麼刪除索引是一個很好的選擇
包含時間戳列
該選項默認是開著的當它開著的時候會比較時間戳列並顯示時間戳是否有差異但它不會更新目標庫也不會產生更新的腳本關閉該選項將不會比較時間戳
不使用事務
激活這個選項將阻止腳本在事務中執行默認情況下它是激活的
排除表示列
默認情況下
該選項是關閉的
因此會比較標識列的值
當激活該選項的時候
表示列的值不會被比較
也不會顯示該列的不同之處
但我發現
當表示列是主鍵的一部分時
即使該選項被激活
也會比較標識列
消除尾部空格
激活該選項會在更新目標庫的時候刪除列中尾部的空格
希望到此為止我已經介紹得比較充分而你們也能發現數據比較非常有用如果你還沒有使用這項功能可以下載試用
From:http://tw.wingwit.com/Article/program/Oracle/201311/18874.html