【问题标题】:C# and SQL Server 2008 - script differences between dev and production database?C# 和 SQL Server 2008 - 开发和生产数据库之间的脚本差异?
【发布时间】:2010-10-19 08:31:23
【问题描述】:

我有一个用于所有开发和测试的数据库和一个用作生产数据库的第二个数据库。编写两者之间的表(仅结构)差异的最佳方法是什么?我的开发数据库可能有我的生产没有的新列,我需要在不(显然)影响生产数据库中的数据的情况下将差异引入生产端。

【问题讨论】:

    标签: c# sql-server


    【解决方案1】:

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

    如果您无法使用 VS2010 Ultimate 或 Premium,也没有 VS2008 Team 或 Database Edition,我建议您查看 http://www.red-gate.com/(如 http://www.red-gate.com/products/SQL_Compare/index.htm)的一些产品,它们具有相似的功能。

    【讨论】:

    • Sql 比较(及其配套的 Sql 数据比较)非常棒,物有所值。
    • Oleg,你在 VS 中使用的是哪个版本控制?
    • @AlexKuznetsov:嗨!您的问题似乎没有连接到 C# 和 SQL Server 2008 和数据库比较。尽管如此,我还是继续使用旧的 Visual SourceSafe。我用了很长时间,对版本控制没有太多要求。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      还有一些工具可以做到这一点。 RedGate Compare 太棒了! MS TFS DB 版本也有一个架构比较,但 RedGate 的更好,IMO。

      【讨论】:

      • 脚本+1。我编写所有表更新、新数据插入等脚本,并按顺序将它们存储在源代码管理中。天堂禁止出现故障,由于某种原因我没有任何备份,我总是可以从头开始重建;)
      【解决方案4】:

      您想查看Red Gate SQL Compare。这一切都会为您处理。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          您可以使用系统视图来查询这些数据。以下示例假定您的数据库位于同一台服务器上。本质上,您为每个表/列/数据类型集进行子查询,并在表和列名上连接两者。任何差异都将通过连接两侧的 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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-21
            • 1970-01-01
            相关资源
            最近更新 更多