T-SQL脚本复制所有表约束

时间:2009-10-05 18:19:51

标签: sql tsql ddl

我在本地数据库上创建了许多表,并将它们移动到生产数据库。

现在我正在调整数据库并在我的本地数据库表上创建了许多约束,例如PK,FK,默认值,索引等。

现在我想只将这些约束复制到生产数据库。有办法吗?

请注意我的生产数据库表已经填充了一些数据。所以我不能放弃并重新创建它们。

6 个答案:

答案 0 :(得分:16)

如果您不想购买任何工具(完全物有所值,BTW),您始终可以查询系统目录视图,并从中提取信息以创建可在新数据库上执行的脚本。

例如默认约束,此查询显示数据库中所有默认约束的列表:

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的知识。

所以这是一个传统的“制造或购买”决定: - )

马克

答案 1 :(得分:3)

最好的方法是将所有DDL代码存储在源代码管理中。然后使用dbGhost(我最喜欢的)或SQL Compare

等工具将其部署到生产环境中

答案 2 :(得分:2)

Red Gate的SQL Compare是一种流行的,非自由的方式。

答案 3 :(得分:1)

当然这是一篇旧帖子,但上述所有答案中的所有脚本都没有列出表格模式。所以它没有解决我的数据库的问题。

这个确实如此,所以它确实:

-- ===========================================================
-- 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的blog here

编辑 NB:确保在删除默认约束之前运行查询的两个部分并保存第二个结果集(即ADD CONSTRAINT s) ,否则你再也无法重新创造它们(不,我没有做到这一点)。

答案 4 :(得分:0)

一款优秀的免费 Microsoft工具。您可以导出架构和数据。

Microsoft SQL Server Database Publishing Wizard

答案 5 :(得分:0)

尝试DBSourceTools。 http://dbsourcetools.codeplex.com
它具有模式比较功能,可帮助您创建更新脚本 但请记住,您应该在整个数据库中使用源代码控制 这就是DBSourceTools的目的 - 帮助开发人员将他们的数据库置于源代码控制之下。