Сценарии T-SQL для копирования всех ограничений таблицы - PullRequest
8 голосов
/ 05 октября 2009

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

Сейчас я работаю над тонкой настройкой базы данных и создал множество ограничений для моих локальных таблиц базы данных, таких как PK, FK, Значения по умолчанию, Индексы и т. Д. И т. Д.

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

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

Ответы [ 6 ]

16 голосов
/ 05 октября 2009

Если вы не хотите покупать какие-либо инструменты (кстати, они стоят своей цены), вы всегда можете запросить представления системного каталога и извлечь из него информацию для создания сценариев, которые вы могли бы выполнить в своей новой базе данных.

В случае, например, ограничения по умолчанию, этот запрос показывает список всех ограничений по умолчанию в вашей базе данных:

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 в процессе.

Итак, это традиционное решение "сделай или купи" снова и снова: -)

Марк

3 голосов
/ 05 октября 2009

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

2 голосов
/ 05 октября 2009

Red Gate's SQL Compare - популярный несвободный способ сделать это.

1 голос
/ 21 января 2016

Конечно, это старый пост, но ни один из сценариев во всех приведенных выше ответах также не содержит схем таблиц. Так что это не сработало для моей базы данных.

Это так, так оно и было:

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

Я адаптировал его из блога Донабель Сантос здесь .

РЕДАКТИРОВАТЬ и NB: Обязательно запустите обе части запроса и сохраните второй набор результатов (т. Е. ADD CONSTRAINT s), прежде чем отбрасывать ограничения по умолчанию, иначе вы выиграли не смогу воссоздать их снова (нет, я этого не делал :)

0 голосов
/ 21 июля 2010

Попробуйте DBSourceTools. http://dbsourcetools.codeplex.com
Он имеет функцию сравнения схем, которая поможет вам создать скрипт обновления.
Имейте в виду, однако, что вы должны использовать контроль исходного кода всей вашей базы данных.
Это то, для чего был разработан DBSourceTools - помочь разработчикам привести свои базы данных под контроль исходного кода.

0 голосов
/ 06 октября 2009

Хороший и бесплатный инструмент Microsoft. Вы можете экспортировать схему и данные.

Мастер публикации баз данных Microsoft SQL Server

...