2009-10-05 5 views
8

ローカルデータベースに多数のテーブルを作成し、それらを本番データベースに移動しました。すべてのテーブル制約をコピーするT-SQLスクリプト

今、私は微調整にデータベースの作業や、PK、FK、デフォルト値としての私のローカルデータベーステーブル上の多くの制約を作成しています、インデックスなどなど

今、私はにのみ、これらの制約をコピーしたいと思いますプロダクションデータベース。それを行う方法はありますか?

私の本番データベースのテーブルにはすでにデータが入力されています。だから私はそれらを落として再作成することはできません。

答えて

2

レッドゲートのSQL Compareはこれを行うための一般的ではない方法です。

3

すべてのDDLコードをソースコントロールに格納することをお勧めします。 dbGhost(私のお気に入り)またはSQL Compare

+0

私は10年間DbGhostを使用しましたが、それは私を失望させませんでした。 – penderi

+0

私が長年使ってきたもう一つの選択肢はAdeptSQL Diffです。無料ではありませんが、スキーマとデータの比較は非常に高速で、アプリケーション内から更新スクリプトを生成して実行することができます。しかし、バージョン管理下でのスクリプトの取得も重要です。 – DarinH

16

などのツールを使用して実稼働に導入することができます。価格は全くかかりませんが、いつでもシステムカタログビューを調べることができます。そこから情報を抽出して、新しいデータベースで実行できるスクリプトを作成します。

例えば、デフォルトの制約は、このクエリは、あなたのデータベース内のすべてのデフォルトの制約のリストを示しています

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可能性結果として生じるT-SQLがあなたの好きなところに出力されるのは弱いですが、基本的には&をコピーして新しいデータベースに貼り付けてください。

もちろん、外部キーリレーションシップ(sys.foreign_keys)、チェック制約(sys.check_constraints)、インデックス(sys.indexesおよびsys.index_columns)などにも同様のシステムカタログビューがあります。

これはちょっとした作業ですが、自分の時間に行うことができます。その過程でSQL Serverについて多くのことを学ぶことができます。

だから、

:-)すべてやり直す良いと無料マイクロソフトのツールマーク

0

DBSourceToolsを試してみてください。 http://dbsourcetools.codeplex.com
更新スクリプトの作成に役立つスキーマ比較機能があります。
ただし、データベース全体でソースコードコントロールを使用する必要があることに注意してください。
これはDBSourceToolsが設計したもので、開発者がデータベースをソース管理下に置くのに役立ちます。

1

確かにこれは古い投稿ですが、上記のすべての回答のスクリプトのどれもがテーブルスキーマを出していません。だから私のデータベースのためのボックスを動作させませんでした。

それがなかったので、この1つは、ありません:私はDonabelサントスのblog hereからそれを適応

-- =========================================================== 
-- 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 

EDITNB:を再作成する彼らすることはできません他、クエリの両方の部分を実行し、デフォルトの制約をドロップする前に、2番目の結果セット(すなわちADD CONSTRAINT複数可)を必ず保存してください私はこれをやっていませんでした。

関連する問題