【发布时间】:2010-10-19 08:31:23
【问题描述】:
我有一个用于所有开发和测试的数据库和一个用作生产数据库的第二个数据库。编写两者之间的表(仅结构)差异的最佳方法是什么?我的开发数据库可能有我的生产没有的新列,我需要在不(显然)影响生产数据库中的数据的情况下将差异引入生产端。
【问题讨论】:
标签: c# sql-server
我有一个用于所有开发和测试的数据库和一个用作生产数据库的第二个数据库。编写两者之间的表(仅结构)差异的最佳方法是什么?我的开发数据库可能有我的生产没有的新列,我需要在不(显然)影响生产数据库中的数据的情况下将差异引入生产端。
【问题讨论】:
标签: c# sql-server
如果您使用 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)的一些产品,它们具有相似的功能。
【讨论】:
有很多方法可以做到这一点,但最流行的方法之一是使用 Red-Gate SQL Compare (www.red-gate.com) 之类的工具。如果没有这样的工具,我们的开发团队就会迷失方向。
【讨论】:
我在 dev 中创建 ALTER/CREATE 脚本,然后在推送到 prod 期间将它们作为我的更新包的一部分运行。
还有一些工具可以做到这一点。 RedGate Compare 太棒了! MS TFS DB 版本也有一个架构比较,但 RedGate 的更好,IMO。
【讨论】:
您想查看Red Gate SQL Compare。这一切都会为您处理。
【讨论】:
我通常首先在生产环境中创建新字段(和表)。然后为我的开发数据库使用生产备份。这样,您就不会犯错误,即部署使用尚未部署的字段的代码。但我想这种方法最适合在没有严格部署程序(和愤怒的 DBA)的小公司工作。
【讨论】:
您可以使用系统视图来查询这些数据。以下示例假定您的数据库位于同一台服务器上。本质上,您为每个表/列/数据类型集进行子查询,并在表和列名上连接两者。任何差异都将通过连接两侧的 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
【讨论】: