Как создавать скрипты индексов, ключей, внешних ключей в SQL Server - PullRequest
7 голосов
/ 28 декабря 2010

Я хотел бы получить подробную информацию обо всех индексах, ключах и внешних ключах из базы данных в SQL Server (2008). Как мне это сделать?

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

Я могу использовать SQL Server Management Studio, но не могу сделать полное резервное копирование базы данных из-за ограничений, установленных веб-хостером.

-

Вторичный вопрос, на который вам не нужно отвечать:

Почему не может быть чего-то похожего на схему базы данных в Mysql, которая просто перечисляет всю структуру базы данных в формате текстового сценария SQL?

Ответы [ 6 ]

6 голосов
/ 28 декабря 2010

Если вы используете по крайней мере SQL Server 2005 или выше, вы можете использовать Мастер публикации баз данных для создания сценария вашей схемы

Это можно использовать для создания сценариев только для схемы, данных илиоба.

Он интегрируется непосредственно в Visual Studio 2005 и / или Visual Web Developer 2005

Если вы используете VS2008, версия SQL Publishing Wizard Wizard поставляется с предварительно установленной версией.Вы можете проверить здесь , откуда его вызвать.

5 голосов
/ 28 декабря 2010

Если вы ищете более детализированные, более конкретные объекты для сценариев, вы также можете использовать сценарии создания из соответствующей опции БД Task > Generate Scripts.

Проверьте http://www.kodyaz.com/articles/sql-server-script-data-with-generate-script-wizard.aspx для получения подробной информации.

2 голосов
/ 29 января 2014

Если вам нужно получить скрипт из T-SQL, используйте только xp_cmdshell.Например, создание сценария для конкретного индекса конкретного представления с SMO и powershell (результат в переменной @script, вы можете выполнить его с помощью sp_executesql):

DECLARE @OUTPUT TABLE (line nvarchar(max))
DECLARE @cmd VARCHAR(8000), @ps VARCHAR(8000), @psLoadAssemblies VARCHAR(8000), @script nvarchar(max) =''
DECLARE @srv nvarchar(max)='<server name>', 
        @ln nvarchar(max)='<login>', 
        @pw nvarchar(max)='<password>', 
        @db nvarchar(max) = '<database>', 
        @schemaName nvarchar(max) = '<schema>',  -- without '[' ']'
        @viewName nvarchar(max) = '<view name>',  -- without '[' ']'
        @indexName nvarchar(max) = '<index name>' -- without '[' ']'

SET @psLoadAssemblies  = '[System.Reflection.Assembly]::LoadWithPartialName(''Microsoft.SqlServer.SMO'')|Out-Null;'
SET @ps='$using=''Microsoft.SqlServer.Management.Smo'';$s=new-object($using+''.Server'') $srv;$c = $s.ConnectionContext;$c.LoginSecure=$false;$c.Login=$ln;$c.Password=$pw; Write-Host ($s.Databases[$db].Views.Item($viewName,$schemaName).Indexes[$indexName].Script())'
SET @ps=REPLACE(@ps,'$srv',''''+@srv+'''')
SET @ps=REPLACE(@ps,'$ln',''''+@ln+'''')
SET @ps=REPLACE(@ps,'$pw',''''+@pw+'''')
SET @ps=REPLACE(@ps,'$db',''''+@db+'''')

SET @ps=REPLACE(@ps,'$schemaName',''''+@schemaName+'''')
SET @ps=REPLACE(@ps,'$viewName',''''+@viewName+'''')
SET @ps=REPLACE(@ps,'$indexName',''''+@indexName+'''')

SET @cmd = 'powershell -Command "'+@psLoadAssemblies+@ps+'"'
exec dev.Msg @cmd
INSERT INTO @OUTPUT
exec xp_cmdshell @cmd

SELECT @script+line FROM @OUTPUT
WHERE line is not null

PRINT @script

PS Для тех, кто спрашивает, зачем нам нужны такие хитростиВ некоторых сценариях, например, «импортировать данные с использованием стороннего инструмента», подход «отбросить-воссоздать» работает лучше, чем «включить-отключить» объекты, например, потому что такой сторонний инструмент может вызвать «усечение» и если ваша таблица участвует в привязке к схемев представлении вы получите ошибку стороннего инструмента (усечение таблицы, участвующей в индексированных представлениях, приводит к ошибке, поэтому мы вынуждены отбросить представление со всеми индексами перед импортом и воссоздать его после).

2 голосов
/ 28 декабря 2010
1 голос
/ 28 декабря 2010

В качестве альтернативы идеальному ответу InSane, вы можете щелкнуть правой кнопкой мыши любой объект в SSMS, чтобы записать его в текстовый файл или окно.
Несколько бесплатных и несвободных продуктов также позволяют вам это, в том числе WinSQL .

0 голосов
/ 13 февраля 2014

Я видел комментарий или ответ пользователя "dontomoso".После перевода на английский язык кажется, что «Операция недопустима из-за текущего состояния объекта. (SqlPubWiz)» в «мастере публикации баз данных» - это ошибка, возникшая.

После стольких экспериментов и испытаний,в этом приложении.имя базы данных чувствительно к регистру.Укажите правильное значение регистра для параметра -d.Решение простое: измените имя схемы по умолчанию или имя исходного каталога так же, как «используется при создании БД».Например, при создании, если используется playGround, используйте и здесь playGround ... Эта ошибка возникает на игровой площадке, на детской площадке или на PlayGround.

Надеюсь, это поможет!

...