跨多个数据库比较存储过程(SQL Server)

Geo*_*ton 14 t-sql sql-server synchronization

SQL大师 -

我们的架构由多个客户数据库和一个公共代码库组成.部署数据库更改时,必须在每个数据库中运行脚本.

由于部署问题,有时候我们的存储过程变得彼此不同步.我想创建一个脚本来返回这些匹配的程序,以确保我们在部署后同步数据库的副本.

是否可以比较两个或多个数据库,让脚本查看两个数据库之间的所有过程,并返回不匹配?

有效的东西:

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
Run Code Online (Sandbox Code Playgroud)

作为奖励,是否可以让脚本通过将最新脚本应用于过时脚本来自动同步数据库?

非常感谢!

Ran*_*der 19

有很多工具可以做到这一点.其中最好的是Red-Gate SQL Compare.另一个非常好的替代方法是使用Visual Studio Database Professional来管理数据库模式.除此之外,它将做非常好的架构比较.

  • SQL Compare正是我想到的,很棒的建议!http://www.red-gate.com/products/SQL_Compare/index.htm (5认同)
  • 优秀的工具 - 而不仅仅是这一个 - 来自Redgate的一切都是一流的. (3认同)

SQL*_*ace 11

如果您没有针对DB架构师的SQL Compare或Visual Studio团队系统(Data Dude)...请使用此... 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)
Run Code Online (Sandbox Code Playgroud)

  • 它看起来不错,但我只对当前数据库有定义,尽管在 object_id 之前使用了数据库或别名。来自 Microsoft:“SQL Server 数据库引擎假定 object_id 位于当前数据库上下文中。对象定义的排序规则始终与调用数据库上下文的排序规则相匹配。” (2认同)

小智 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' 
Run Code Online (Sandbox Code Playgroud)