Развертывание базы данных (vsdbcmd.exe): DatabaseName и DefaultDataPath игнорируются?
Редакция базы данных Visual Studio поставляется с инструментом vsdbcmd.exe, который должен позволить кому-то развернуть файл.dbschema (который создается проектом базы данных при сборке) в базе данных. Это делается путем создания сценария, а затем его выполнения:
vsdbcmd.exe / a: Развертывание /cs:"Источник данных =(локальный); Интегрированная безопасность = Истина; Объединение = Ложь" /dsp:Sql /dd /model:"..\Database.dbschema" /p:TargetDatabase=TargetDB /manifest:"..\Database.deploymanifest"
Я ожидаю, что он может развернуть сценарий на другом сервере базы данных без проблем. Однако полный путь к фактическому файлу.mdf кодируется в сценарии вместе с некоторыми другими ссылками на исходную базу данных. Либо нет возможности контролировать это, либо я не могу его найти.
Кто-нибудь использует это? Как вы развертываете? Должен ли я использовать другой тип проекта базы данных (я помню, когда у меня был выбор между "проектом базы данных" и "проектом сервера", но я не знаю, имеет ли это значение)?
РЕДАКТИРОВАТЬ
Я могу просто переопределить.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 ответа
Это может быть (является) вызвано при выполнении синхронизации схемы базы данных -> Проект базы данных. (Моя среда VS2010 Enterprise RTM).
Сгенерированные операторы ALTER DATABASE создаются для зеркального отображения исходной базы данных без учета каких-либо подстановочных значений (в нее также входят начальные размеры базы данных и т. Д.) Проблема не появляется при первоначальном импорте базы данных.
Отредактируйте файлы, найденные в...
Объекты схемы \ Объекты уровня базы данных \ Хранилище \ Файлы
... и исправить их, чтобы они содержали правильные $(DefaultDataPath)$(DatabaseName).mdf
/$(DefaultLogPath)$(DatabaseName)_log.ldf
значения - или другие - в зависимости от обстоятельств. (Теперь отметьте их как "Пропустить" в вашей схеме сравнения:-P)
С вышеупомянутой "корректировкой" сохранение значений внешних будет снова работать и является предпочтительным методом управления такими свойствами.
Удачного кодирования.
На основании ваших правок, возможно, это полезно. https://blogs.msdn.com/gertd/Default.aspx?p=7
Добавление переменных
До сих пор мы рассматривали, как все работает, теперь пришло время добавить некоторые новые переменные и заставить их работать. Единственное место, где переменные пригодятся, - это файл после развертывания, который определяет файлы: storage.sql. Переменные позволят использовать, чтобы сделать среду размещения зависимой.
Внутри файла хранилища вы найдете что-то вроде этого:
ЕСЛИ НЕ СУЩЕСТВУЕТ (ВЫБЕРИТЕ 1 ИЗ dbo.sys-файлов, ГДЕ имя = 'fgdb_data') НАЧАТЬ ИЗМЕНИТЬ БАЗУ ДАННЫХ [$(имя базы данных)] ДОБАВИТЬ ФАЙЛ (ИМЯ = N'fgdb_data', FILENAME = N'C:\Program Files\Microsoft SQL Server\ \ MSSQL.1\MSSQL\DATA\fgdb_data.ndf', MAXSIZE = 100 МБ, FILEGROWTH = 10 МБ) В FILEGROUP [ТАБЛИЦЫ] КОНЕЦ
Мы можем параметризовать это так, чтобы диск и каталог абстрагировались через переменную:
: диск setvar "C:": каталог setvar "Программные файлы \Microsoft SQL Server\MSSQL.1\MSSQL\DATA"
ЕСЛИ НЕ СУЩЕСТВУЕТ (ВЫБЕРИТЕ 1 ИЗ dbo.sys-файлов, ГДЕ имя = 'fgdb_data') НАЧАТЬ ИЗМЕНИТЬ БАЗУ ДАННЫХ [$(имя базы данных)] ДОБАВИТЬ ФАЙЛ (ИМЯ = N'fgdb_data ',FILENAME = N' $ (диск)\$(каталог) \ $ fgdb_data.ndf ', MAXSIZE = 100 МБ, FILEGROWTH = 10 МБ) В FILEGROUP [ТАБЛИЦЫ] КОНЕЦ
Теперь, когда мы настроили сценарий, затем мы хотим сделать переменные частью файла проекта, чтобы они были определены в одном месте, а не разбросаны по коду в разных местах с помощью операторов setvar.
Извините, я только начинаю изучать ГДР, но мне нужен ответ на этот вопрос