2010-01-25 109 views
9

SQL大師 -比較跨多個數據庫的存儲過程(SQL Server)

我們的體系結構由多個客戶數據庫組成一個通用代碼庫。當我們部署數據庫更改時,必須在每個數據庫運行腳本。

由於部署問題,我們的存儲過程變得不同步。我想創建一個腳本來返回這些不匹配的過程,以確保在部署後我們已經同步備份了我們的數據庫。

是否可以通過讓腳本查看兩個數據庫之間的所有過程來比較兩個或多個數據庫並返回不匹配?

某事的效果:

DATABASE_1 | DATABASE_2 | MISMATCHED_PROCEDURE | DATABASE_1_MODIFY_DATE | DATABASE_2_MODIFY_DATE 
Customer_1 | Customer_2 | sp_get_names   | 1/1/2010    | 1/2/2010 
Customer_1 | Customer_2 | sp_add_person  | 1/5/2010    | 1/6/2010 

作爲獎金,將有可能使用該腳本自動同步通過應用最新的腳本外的日期的腳本的數據庫?

非常感謝!

回答

15

有很多工具可以做到這一點。其中最好的之一是Red-Gate SQL Compare。另一個非常好的選擇是使用Visual Studio Database Professional來管理數據庫模式。除此之外,它會做非常好的模式比較。

+4

SQL比較正是我想到的,偉大的建議! http://www.red-gate.com/products/SQL_Compare/index.htm – D3vtr0n 2010-01-25 16:51:15

+2

優秀的工具 - 而不僅僅是這個 - 從Redgate的一切都是頂尖的。 – 2010-01-25 16:52:04

+0

@marc_s - 同意。幾乎所有來自紅門的東西都是金子。 – 2010-01-25 16:56:30

8

如果你沒有SQL比較或Visual Studio Team System中的DB架構師(數據多德)...玩這個...... SQL 2005和高達

select t1.name,t1.modify_date,t2.modify_date 
from Database1.sys.procedures t1 
join Database2.sys.procedures t2 on t1.name = t2.name 
and object_definition(t1.object_id) <> object_definition(t2.object_id) 
1

簡單化的回答,但下降並在所有程序上創建腳本將非常簡單而有效。

3

紅門的SQL比較是一個完美的解決方案。 但是,如果您不能負擔其成本有一個很不錯的軟件,是免費:星Inix的SQL比較http://www.starinix.com/sqlcompare02.htm

+0

沒有打磨,但真的是一個不錯的小工具...考慮到它是免費的。它對dbs的基本比較做了很好的工作,但必須注意安裝時的cnet垃圾郵件。 – Dave 2012-11-14 19:08:41

+0

列出的URL不適用於我。但是,URL http://starinix.com/sqlcompare02.htm確實有效。 – 2015-12-29 21:17:36

11

您可以識別哪些程序(並稍加修改其他對象)不同的使用腳本下面。

要同步數據庫,您可能需要嘗試ApexSQL Diff。它與Red Gate的SQL Compare類似。

select S1.name [Db1_Schema], O1.name as [Db1_Object], O1.modify_date, 
S2.name [Db1_Schema], O2.name as [Db1_Object], O2.modify_date 
from database.sys.all_objects O1 
inner join database2.sys.all_objects O2 on O1.name = O2.name 
inner join database.sys.syscomments C1 on O1.object_id = C1.id 
inner join database2.sys.syscomments C2 on O2.object_id = C2.id 
inner join database.sys.schemas S1 on O1.schema_id = S1.schema_id 
inner join database2.sys.schemas S2 on O2.schema_id = S2.schema_id 
where C1.text <> C2.text and 
-- remove the line below if you want to search all objects 
O1.type = 'P' 
+0

謝謝......它的工作原理.....但是當我在兩種環境中運行時,我獲得了更多的記錄。每個分區有107個程序,但是當執行上述查詢時,我得到了超過100,000條記錄..plz建議 – Smart003 2016-07-13 12:42:56

+0

這段代碼告訴我所有的SP都不同(它們不是),即比較C1.text < > C2.text始終如此。我從下面的答案中嘗試了object_definition(t1.object_id)<> object_definition(t2.object_id),並對它進行了排序 – DJDave 2016-08-08 11:00:40

1

如果要比較來自兩個數據庫和那些沒有在其他存在的輸出名稱所有的存儲過程,然後使用以下。請注意,這並不檢查存儲過程的定義,只是它的名稱,但也有一種方法可以檢查這一點。

-- Declare 2 variable names to hold the name of the databases 
DECLARE @DB1 varchar(50) 
SET @DB1 = 'nameOfDb1' 
DECLARE @DB2 varchar(50) 
SET @DB2 = 'nameOfDb2' 
EXEC('SELECT 
     t1.name, 
     t2.name 
     FROM ' 
     + @DB1 +'.sys.procedures t1 
     FULL OUTER JOIN ' 
    + @DB2 + '.sys.procedures t2 
     on t1.name = t2.name 
     where t1.object_id IS NULL 
     OR t2.object_id IS NULL') 
1

是,展鵬東西是偉大的,但是這就是我所做的存儲過程在兩個不同的數據庫比較: 1 - 腳本所有的存儲過程爲獨立的文件。您可以通過Microsoft SQL Server Management Studio嚮導執行此操作。 2 - 與我比較的其他數據庫是否一樣。 3 - 開始KDiff3這是免費的,我相信。 4 - 給它它需要通過兩個目錄。 5 - 現在通過雙擊檢查結果,您會看到紅色,下面的面板會告訴您不同之處。

完成!

0

以下過程可以找出兩個不同數據庫中函數,過程,觸發器的區別。傳遞數據庫名稱作爲參數。

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE Specific_name = 'SP_SCRIPTDIFF') 

DROP PROCEDURE DBO.SP_SCRIPTDIFF 

GO 

CREATE PROCEDURE [dbo].SP_SCRIPTDIFF 

@DBNAME1 SYSNAME, 
@DBNAME2 SYSNAME 

AS 

/* 
DATE  : 2016/07/29 
AUTHOR : SEENI 
OBJECTIVE : TO COMPARE THE FUNCTIONS, PROCEDURES AND TRIGGERS IN TWO DIFFERENT DATABASES, PASS NAME OF DATABASE1, AND DATABASE2 AS INPUTS. 
*/ 

BEGIN 

SET NOCOUNT ON 

Exec ('select DISTINCT O1.name as [ObjectName], O1.modify_date As DateIn_'[email protected]+', O2.modify_date As DateIn_'[email protected]+',o1.type as Type from '+ 
@DBNAME1+'.sys.all_objects O1 join '+ @DBNAME2+'.sys.all_objects O2 on O1.name = O2.name and O1.type = O2.type join '+ 
@DBNAME1+'.sys.syscomments C1 on O1.object_id = C1.id join '+ @DBNAME2+'.sys.syscomments C2 on O2.object_id = C2.id join '+ 
@DBNAME1+'.sys.schemas S1 on O1.schema_id = S1.schema_id join '+ @DBNAME2+'.sys.schemas S2 on O2.schema_id = S2.schema_id 
where C1.text <> C2.text and c1.colid = c2.colid and O1.Type in (''FN'',''P'',''T'') And o1.Is_Ms_Shipped = 0 Order by O1.type,ObjectName') 

RETURN 

END 

GO 
相關問題