Развертывание базы данных (vsdbcmd.exe): DatabaseName и DefaultDataPath игнорируются? - PullRequest
12 голосов
/ 31 марта 2009

Редакция базы данных Visual Studio поставляется с инструментом vsdbcmd.exe, который должен позволять кому-либо развертывать файл .dbschema (который создается проектом базы данных при сборке) в базе данных. Для этого сначала создается скрипт, а затем выполняется:

vsdbcmd.exe / a: Развернуть / cs: «Источник данных = (локальный); Интегрированная безопасность = Истина; Пул = Ложь» / dsp: Sql / dd /model:"..\Database.dbschema "/ p: TargetDatabase = TargetDB /manifest:"..\Database.deploymanifest"

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

Кто-нибудь этим пользуется? Как вы развертываете? Должен ли я использовать другой тип проекта базы данных (я помню, когда у меня был выбор между «проектом базы данных» и «проектом сервера», но я не знаю, имеет ли это значение)?

EDIT

Я могу просто переопределить .sqlcmdvars, но это не решает проблему. Это извлечение из сгенерированного файла .sql с помощью команды, подобной приведенной выше:

GO
:setvar DatabaseName "TargetDB"
:setvar DefaultDataPath "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\"

Таким образом, целевая база данных «targettdb» записывается правильно. Но, несколько строк дальше:

CREATE DATABASE [$(DatabaseName)]
ON 
PRIMARY(NAME = [Original], FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\Original.mdf', SIZE = 3072 KB, MAXSIZE = UNLIMITED, FILEGROWTH = 1024 KB)
LOG ON (NAME = [Original_log], FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\Original_log.ldf', SIZE = 1024 KB, MAXSIZE = 2097152 MB, FILEGROWTH = 10 %)

где Original.mdf - это имя исходной базы данных (т. Е. База данных, в которой мы развертываем во время разработки, и это задается в свойствах проекта проекта базы данных). Это - то, где развертывание терпит неудачу, или потому что этот точный путь может отличаться на целевой машине или на моей машине, потому что эта база данных уже существует.

Эти значения кажутся жестко закодированными в сгенерированном скрипте.

Ответы [ 2 ]

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

Это может быть (является) вызвано при выполнении Синхронизация схемы базы данных -> Проект базы данных . (Моя среда VS2010 Enterprise RTM).

Сгенерированные операторы ALTER DATABASE создаются для зеркального отображения базы данных source без учета каких-либо подстановочных значений (в нее также входят начальные размеры базы данных и т. Д.). Проблема не появляется при первоначальном импорте базы данных.

Редактировать файлы, найденные в ...

Объекты схемы \ Объекты уровня базы данных \ Хранилище \ Файлы

... и исправьте их, чтобы они содержали правильные значения $(DefaultDataPath)$(DatabaseName).mdf / $(DefaultLogPath)$(DatabaseName)_log.ldf - или другие - в зависимости от ситуации. (Теперь отметьте их как «Пропустить» в своей схеме сравнения :-P)

При вышеупомянутой «коррекции» сохранение значений внешних значений снова будет работать и является предпочтительным методом управления такими свойствами.

Удачного кодирования.

1 голос
/ 28 апреля 2009

На основании ваших правок, возможно, это полезно. https://blogs.msdn.com/gertd/Default.aspx?p=7

Добавление переменных

До сих пор мы рассматривали, как все работает, теперь пришло время добавить некоторые новые переменные и заставить их работать. Единственное место, где переменные пригодятся, это файл после развертывания, который определяет файлы: storage.sql. Переменные позволят использовать, чтобы сделать среду размещения зависимой.

Внутри файла хранилища вы найдете что-то вроде этого:

ЕСЛИ НЕ СУЩЕСТВУЕТ (ВЫБЕРИТЕ 1 ИЗ dbo.sys-файлов ГДЕ name = 'fgdb_data') НАЧАТЬ ALTER DATABASE [$ (имя базы данных)] ДОБАВИТЬ ФАЙЛ ( NAME = N'fgdb_data ', FILENAME = N'C: \ Program Files \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ DATA \ fgdb_data.ndf ', MAXSIZE = 100 МБ, FILEGROWTH = 10 МБ ) В FILEGROUP [ТАБЛИЦЫ] END

Мы можем параметризовать это так, чтобы диск и каталог абстрагировались через переменную:

: установка привода "C:" : setvar каталог "Программные файлы \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ DATA"

ЕСЛИ НЕ СУЩЕСТВУЕТ (ВЫБЕРИТЕ 1 ИЗ dbo.sys-файлов ГДЕ имя = 'fgdb_data') НАЧАТЬ ALTER DATABASE [$ (имя базы данных)] ДОБАВИТЬ ФАЙЛ ( NAME = N'fgdb_data ', FILENAME = N '$ (диск) \ $ (каталог) \ fgdb_data.ndf', MAXSIZE = 100 МБ, FILEGROWTH = 10 МБ ) В FILEGROUP [ТАБЛИЦЫ] END

Теперь, когда мы настроили сценарий, затем мы хотим сделать переменные частью файла проекта, чтобы они были определены в одном месте, а не разбросаны по коду в разных местах с помощью операторов setvar. *

Извините, я только начинаю изучать ГДР, но мне нужен ответ на этот вопрос

...