2009-10-05 1 views
8

Я создал много таблиц в своей локальной базе данных и перенес их в производственную базу данных.Сценарии T-SQL для копирования всех ограничений таблицы

Сейчас я работаю над тонкой настройкой базы данных и создал много ограничений на моих локальных таблицах баз данных, такие как ПК, FK, значения по умолчанию, индексы и т.д. и т.п.

Теперь я хотел бы, чтобы скопировать только эти ограничения на производственной базы данных. Есть ли способ сделать это?

Обратите внимание, что таблицы моей рабочей базы данных уже заполнены некоторыми данными. Поэтому я не могу их воссоздать и воссоздавать.

ответ

3

Лучшим способом было бы сохранить весь ваш DDL-код в исходном элементе управления. Затем разверните его для производства с помощью таких инструментов, как dbGhost (мой любимый) или SQL Compare

+0

Я использовал DbGhost в течение 10 лет, и это никогда не подведет меня, я бы не стал заниматься разработкой SQL-средним без него. – penderi

+0

Другим вариантом, который я использовал в течение длительного времени, является AdeptSQL Diff. Не бесплатный, но сравнение схем и данных происходит очень быстро и может генерировать сценарии обновления и запускать их прямо из приложения. Однако важно, чтобы ваши скрипты под управлением версиями были важны. – DarinH

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

Try 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.

EDIT и NB: Обязательно запустить обе части запроса и сохранить второй набор результатов (т.е. ADD CONSTRAINT ы) перед отбрасыванием ограничений по умолчанию, иначе вы не сможете воссоздать их снова (нет, я этого не делал :)