Как я могу написать скрипт базы данных MS SQL Server с правильным порядком объектов? - PullRequest
5 голосов
/ 17 марта 2009

Я пытаюсь записать базу данных MS SQL Server 2005 в один файл. До сих пор я пытался использовать SQL Management Studio и мастер публикации баз данных MS.

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

Знаете ли вы, как написать схему базы данных с правильным порядком создания объекта?

Ответы [ 5 ]

2 голосов
/ 17 марта 2009

Мой ответ будет немного сложным, и он будет работать, только если вы создадите сценарий для всей своей базы данных (т.е. сохраните все в сценариях SQL). В масштабном проекте мы организовали сценарии в следующую структуру:

  • _ddl : содержит изменения таблицы, такие как новые столбцы, индексы, отношения и т. Д.
  • _fn : сохраненные функции
  • _prc : хранимые процедуры
  • _static : очевидно, «статические данные» или данные, которые должны быть в базе данных при развертывании
  • _tab : таблицы (создавать сценарии)
  • _trg : триггеры
  • _views : просмотр сценариев

Имена папок - это, конечно, случайный выбор, вы всегда можете расположить вещи по-разному. После этого мы создали пакетный скрипт для объединения всех этих файлов в один SQL в следующем порядке:

  • _tab
  • _ddl
  • _trg
  • _views
  • _fn
  • _prc
  • _static

Ключевой трюк состоит в том, чтобы писать свои сценарии так, чтобы их можно было запускать тысячу раз. Это означает: отбросьте ваши процедуры перед их созданием, проверьте, существует ли таблица перед ее созданием, проверьте, существует ли строка, прежде чем добавлять ее в статические, и т. Д.

Это не идеально, но оно выполняет свою работу.

2 голосов
/ 17 марта 2009

Мы используем это для создания сценариев db, мне придется запустить его снова, чтобы сначала убедиться, что он создает зависимости объектов ... но у меня еще не было проблем. http://www.red -gate.com / продукция / SQL_Compare / index.htm

1 голос
/ 13 апреля 2011

Существует наивный, но удивительно эффективный способ решения проблемы упорядочения: продолжайте запускать каждый скрипт. Отдельный скрипт будет в конечном итоге работать (после того, как другие скрипты будут запущены первыми) или завершится неудачей> # скриптов (в этом случае это плохой скрипт). Возможно, вам удастся обнаружить плохой сценарий быстрее / проще, но мне это никогда не требовалось.

Если у вас есть 1 гигантский скрипт, он, вероятно, разделен по операторам GO. Этого должно быть достаточно, чтобы запустить его столько раз, сколько существует уникальных операторов GO. Любые попытки СОЗДАТЬ уже существующий объект потерпят неудачу и прервут пакет. Следующая партия будет работать непрерывно. В конце концов, у вас созданы необходимые объекты - и повторный запуск всего скрипта создаст зависимый объект (и произойдет сбой на уже созданных независимых объектах). Вы никогда не сможете запустить скрипт без ошибок.

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

Или потратить $ 500 на покупку инструмента, который уже делает это (RedGate, Visual Studio Ultimate / Database Edition и т. Д.).

0 голосов
/ 20 марта 2009

Вы можете попробовать xSQL Object на http://www.xsqlsoftware.com/Product/Sql_Schema_Compare.aspx Это отлично сработало для меня. Сценарий создается в правильном порядке, когда это возможно (в некоторых случаях сгенерированный сценарий не может быть выполнен напрямую, но в большинстве случаев он работает)

0 голосов
/ 17 марта 2009

У Лектера хороший подход. Вы можете объединить эти сценарии с помощью сценария powershell (или другого языка)

запустить скрипт:

PS builddir:\> .\buildsql.ps1 -currentbuilddir "C:\Documents and Settings\sam\My Documents\svn\ticketing" -buildfile "sqlbuild.sql" -teardownfile
"teardown.sql"

скрипт powershell:

param($currentbuilddir,$buildfile1,$teardownfile)

new-psdrive -name builddir -PSProvider filesystem -Root (resolve-path $currentbuilddir)

cd builddir:

rm $buildfile1
rm $teardownfile


Get-item Scripts_Build_1* | ForEAch-object {cat $_ >> $buildfile1; "GO --SYSTEM INSERTED GO--------------" >> $buildfile1} 

Get-item Scripts_Build_3* | ForEAch-object {cat $_ >> $teardownfile; "GO --SYSTEM INSERTED GO------------" >> $teardownfile} 

Здесь я удаляю файл сборки и разрываю файлы - на самом деле я работал над применением собственного шифрования sql к базе данных, поэтому разборка может быть неприменима. У меня были все мои сценарии в одном каталоге, поэтому, возможно, вам придется изменить этот сценарий, чтобы выполнить некоторую рекурсию.

...