2010-01-25 103 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 
相关问题