我在本地数据库上创建了许多表并将它们移动到生产数据库。
现在我正在对数据库进行微调,并在我的本地数据库表上创建了许多约束,例如 PK、FK、默认值、索引等。
现在我只想将这些约束复制到生产数据库。有没有办法做到这一点?
请注意,我的生产数据库表已经填充了一些数据。所以我不能删除并重新创建它们。
如果您不想购买任何工具(它们完全物有所值,顺便说一句),您可以随时查询系统目录视图,并从那里提取信息以创建可以在新数据库上执行的脚本。
例如,在默认约束的情况下,此查询会显示数据库中所有默认约束的列表:
SELECT
dc.name 'Constraint Name',
OBJECT_NAME(parent_object_id) 'Table Name',
c.name 'Column Name',
definition
FROM
sys.default_constraints dc
INNER JOIN
sys.columns c ON dc.parent_object_id = c.object_id
AND dc.parent_column_id = c.column_id
ORDER BY
OBJECT_NAME(parent_object_id), c.name
并基于此,您当然可以创建一个查询,该查询将发出 T-SQL 语句以在您的目标服务器上重新创建这些默认约束:
SELECT
'ALTER TABLE ' + OBJECT_SCHEMA_NAME(dc.parent_object_id) + '.' + OBJECT_NAME(dc.parent_object_id) +
' ADD CONSTRAINT ' + dc.name + ' DEFAULT(' + definition
+ ') FOR ' + c.name
FROM
sys.default_constraints dc
INNER JOIN
sys.columns c ON dc.parent_object_id = c.object_id
AND dc.parent_column_id = c.column_id
你会得到这样的东西(对于AdventureWorks
示例数据库):
ALTER TABLE dbo.Store ADD CONSTRAINT DF_Store_rowguid DEFAULT((newid())) FOR rowguid
ALTER TABLE dbo.Store ADD CONSTRAINT DF_Store_ModifiedDate DEFAULT((getdate())) FOR ModifiedDate
ALTER TABLE dbo.ProductPhoto ADD CONSTRAINT DF_ProductPhoto_ModifiedDate DEFAULT((getdate())) FOR ModifiedDate
ALTER TABLE dbo.ProductProductPhoto ADD CONSTRAINT DF_ProductProductPhoto_Primary DEFAULT(((0))) FOR Primary
ALTER TABLE dbo.ProductProductPhoto ADD CONSTRAINT DF_ProductProductPhoto_ModifiedDate DEFAULT((getdate())) FOR ModifiedDate
ALTER TABLE dbo.StoreContact ADD CONSTRAINT DF_StoreContact_rowguid DEFAULT((newid())) FOR rowguid
ALTER TABLE dbo.StoreContact ADD CONSTRAINT DF_StoreContact_ModifiedDate DEFAULT((getdate())) FOR ModifiedDate
ALTER TABLE dbo.Address ADD CONSTRAINT DF_Address_rowguid DEFAULT((newid())) FOR rowguid
当然,您可以根据自己的喜好调整生成的 T-SQL 输出 - 但基本上,将查询中的这些结果复制并粘贴到您的新数据库中,然后就可以使用了。
当然,外键关系 (sys.foreign_keys)、检查约束 (sys.check_constraints)、索引 (sys.indexes 和 sys.index_columns) 等也有类似的系统目录视图。
这需要一些工作 - 但可以在您自己的时间完成,并且您将在此过程中学到很多关于 SQL Server 的知识。
所以这又是一个传统的“制造或购买”决定:-)
马克
最好的方法是将所有 DDL 代码存储在源代码管理中。然后使用dbGhost(我最喜欢的)或SQL Compare等工具将其部署到生产环境
Red Gate 的SQL 比较是一种流行的、非免费的方式来执行此操作。
当然,这是一篇旧文章,但上述所有答案中的脚本都没有列出表模式。所以它没有为我的数据库解决问题。
这个有,所以它做到了:
-- ===========================================================
-- Default Constraints
-- How to script out Default Constraints in SQL Server 2005+
-- ===========================================================
-- view results in text, to make copying and pasting easier
-- drop default constraints
SELECT
'ALTER TABLE ' +
QuoteName(OBJECT_SCHEMA_NAME(sc.id)) + '.' + QUOTENAME(OBJECT_NAME(sc.id)) +
CHAR(10) +
' DROP CONSTRAINT ' +
QuoteName(OBJECT_NAME(sc.cdefault))
FROM
syscolumns sc
INNER JOIN
sysobjects as so on sc.cdefault = so.id
INNER JOIN
syscomments as sm on sc.cdefault = sm.id
WHERE
OBJECTPROPERTY(so.id, N'IsDefaultCnst') = 1
-- create default constraints
SELECT
'ALTER TABLE ' +
QuoteName(OBJECT_SCHEMA_NAME(sc.id)) + '.' + QuoteName(OBJECT_NAME(sc.id)) +
' ADD CONSTRAINT ' +
QuoteName(OBJECT_NAME(sc.cdefault))+
' DEFAULT ' +
sm.text +
' FOR ' + QuoteName(sc.name)
+ CHAR(13)+CHAR(10)
FROM
syscolumns sc
INNER JOIN
sysobjects as so on sc.cdefault = so.id
INNER JOIN
syscomments as sm on sc.cdefault = sm.id
WHERE
OBJECTPROPERTY(so.id, N'IsDefaultCnst') = 1
我从这里改编自 Donabel Santos 的博客。
编辑和注意:确保在删除默认约束之前运行查询的两个部分并保存第二个结果集(即ADD CONSTRAINT
s),否则您将无法再次重新创建它们(不,我没有这样做:)
试试 DBSourceTools。http://dbsourcetools.codeplex.com
它具有模式比较功能,可帮助您创建更新脚本。
但请记住,您应该在整个数据库上使用源代码控制。
这就是 DBSourceTools 的设计目的——帮助开发人员将他们的数据库置于源代码控制之下。
一个很好的免费微软工具。您可以导出架构和数据。