C#和SQL Server 2008 - 开发和生产数据库之间的脚本差异?

时间:2010-10-18 17:27:52

标签: c# sql-server

我有一个数据库用于我的所有开发和测试,另一个数据库用作我的生产数据库。在两者之间编写表(仅限结构)差异的最佳方法是什么?我的开发人员数据库可能有我的生产所没有的新列,我需要将差异带入生产方面而不会(显然)影响生产数据库中的数据。

6 个答案:

答案 0 :(得分:4)

如果您使用Visual Studio 2010 Ultimate / Premium Edition或Visual Studio Team / Database Edition 2008,您将在Visual Studio中找到所需的一切。 (另见Handling change in a database schema

如果你不能使用VS2010 Ultimate或Premium而没有VS2008团队或数据库版本,我建议您查看一些http://www.red-gate.com/的产品(如http://www.red-gate.com/products/SQL_Compare/index.htm)及其近似特征。

答案 1 :(得分:3)

许多方法可以做到这一点,但最流行的方法之一是使用Red-Gate SQL Compare(www.red-gate.com)等工具。如果没有这样的工具,我们的开发小组就会丢失。

答案 2 :(得分:1)

我在dev中创建ALTER / CREATE脚本,然后在推送到prod期间将它们作为更新包的一部分运行。

还有一些工具可以做到这一点。 RedGate Compare是一个很棒的人! MS TFS DB版本也有模式比较,但RedGate更好,IMO。

答案 3 :(得分:0)

您想查看Red Gate SQL Compare。这将为您解决所有问题。

答案 4 :(得分:0)

我通常首先在生产中创建新字段(和表)。然后使用我的dev数据库的生产备份。这样,您永远不会错误地部署使用尚未部署的字段的代码。但我想这种方法最适合在没有严格部署程序的小公司工作(以及愤怒的DBA)。

答案 5 :(得分:0)

您可以使用系统视图来查询此数据。以下示例假定您的数据库位于同一服务器上。实质上,您为每个表/列/数据类型集创建一个子查询,并在表和列名称上连接两个。任何差异都将通过连接两侧的NULL来证明。如果你真的想变得聪明,可以添加一个标志列来检查数据类型。就个人而言,我会将这些数据复制到Excel中以便于排序/审核。

select
    a.prod_table,
    a.prod_column,
    a.prod_column_datatype,
    b.dev_table,
    b.dev_column,
    b.dev_column_datatype
from
    (select 
        t1.name prod_table,
        c1.name prod_column,
        dt1.name prod_column_datatype
     from
        prod.sys.tables t1
        join prod.sys.columns c1 on (t1.object_id = c1.object_id)
        join prod.sys.types dt1 on (c1.system_type_id = dt1.system_type_id)) a
    full outer join 
    (select 
        t2.name dev_table,
        c2.name dev_column,
        dt2.name dev_column_datatype
     from
        prod.sys.tables t2
        join prod.sys.columns c2 on (t2.object_id = c2.object_id)
        join prod.sys.types dt2 on (c2.system_type_id = dt2.system_type_id)) b
    on (a.prod_table = b.dev_table and
        a.prod_column = b.dev_column)
order by 
    a.prod_table,
    a.prod_column,
    b.dev_table,
    b.dev_column