2009-10-05 46 views
8

我在本地數據庫上創建了許多表並將它們移至生產數據庫。複製所有表約束的T-SQL腳本

現在我的微調工作數據庫,並在我的本地數據庫表,如PK,FK,默認值,創造了許多約束的索引等等,等等

現在我想只複製這些制約因素生產數據庫。有沒有辦法做到這一點?

請注意我的生產數據庫表已經填充了一些數據。所以我不能放棄並重新創建它們。

回答

3

最好的方法是將所有DDL代碼存儲在源代碼管理中。然後,它像dbGhost(我的最愛)或SQL Compare

+0

我已經使用DbGhost 10年,它永遠不會讓我失望,我不會嘗試沒有它的中等規模的SQL開發。 – penderi 2010-02-21 10:40:39

+0

我長期使用的另一種選擇是AdeptSQL Diff。不是免費的,但它的架構和數據比較速度非常快,並且可以生成更新腳本並在應用程序內直接運行它們。然而,在版本控制下獲取腳本也很重要。 – DarinH 2011-04-14 21:03:52

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樣品DB):

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

所以它:-)

馬克

0

嘗試DBSourceTools。 http://dbsourcetools.codeplex.com
它具有模式比較功能,可以幫助您創建更新腳本。
請記住,您應該在整個數據庫上使用源代碼控制。
這就是DBSourceTools設計的目的 - 幫助開發人員將他們的數據庫置於源代碼控制之下。

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桑托斯的blog here

編輯NB:一定下降默認約束之前運行查詢的兩個部分,並保存第二個結果集(即ADD CONSTRAINT S),否則你將無法重新創建這些再次(不,我沒有這樣做:)