我在本地數據庫上創建了許多表並將它們移至生產數據庫。複製所有表約束的T-SQL腳本
現在我的微調工作數據庫,並在我的本地數據庫表,如PK,FK,默認值,創造了許多約束的索引等等,等等
現在我想只複製這些制約因素生產數據庫。有沒有辦法做到這一點?
請注意我的生產數據庫表已經填充了一些數據。所以我不能放棄並重新創建它們。
我在本地數據庫上創建了許多表並將它們移至生產數據庫。複製所有表約束的T-SQL腳本
現在我的微調工作數據庫,並在我的本地數據庫表,如PK,FK,默認值,創造了許多約束的索引等等,等等
現在我想只複製這些制約因素生產數據庫。有沒有辦法做到這一點?
請注意我的生產數據庫表已經填充了一些數據。所以我不能放棄並重新創建它們。
紅門的SQL Compare是一個流行的,非自由的方式來做到這一點。
最好的方法是將所有DDL代碼存儲在源代碼管理中。然後,它像dbGhost(我的最愛)或SQL Compare
部署到生產中使用的工具。如果你不想買任何工具(這是完全值得的價格,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的知識。
所以它:-)
馬克
一個很好的和免費微軟工具,傳統的「製造或購買」的決定從頭再來。您可以導出架構和數據。
嘗試DBSourceTools。 http://dbsourcetools.codeplex.com
它具有模式比較功能,可以幫助您創建更新腳本。
請記住,您應該在整個數據庫上使用源代碼控制。
這就是DBSourceTools設計的目的 - 幫助開發人員將他們的數據庫置於源代碼控制之下。
確定這是一箇舊帖子,但上述所有答案中的腳本都沒有列出表格模式。所以它沒有解決我的數據庫的問題。
這一個呢,所以也沒:
-- ===========================================================
-- 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),否則你將無法重新創建這些再次(不,我沒有這樣做:)
我已經使用DbGhost 10年,它永遠不會讓我失望,我不會嘗試沒有它的中等規模的SQL開發。 – penderi 2010-02-21 10:40:39
我長期使用的另一種選擇是AdeptSQL Diff。不是免費的,但它的架構和數據比較速度非常快,並且可以生成更新腳本並在應用程序內直接運行它們。然而,在版本控制下獲取腳本也很重要。 – DarinH 2011-04-14 21:03:52