Версия базы данных Visual Studio поставляется с инструментом vsdbcmd.exe, который должен позволить кому-то развернуть файл .dbschema(который создается проектом базы данных при сборке) в базу данных. Он делает это, сначала создав script, а затем выполнив его:
vsdbcmd.exe/a: Deploy/cs: "Источник данных = (локальный); Integrated Security = True; Pooling = False" /dsp: Sql/dd/model: "..\Database.dbschema" /p: TargetDatabase = TargetDB/manifest: "..\Database.deploymanifest"
Я бы предположил, что он может развернуть script на другой сервер базы данных без проблем. Однако полный путь к фактическому файлу .mdf закодирован в script, а также некоторые другие ссылки на исходный файл данных. Либо нет возможности контролировать это, либо я не могу его найти.
Кто-нибудь использует это? Как вы развертываете? Должен ли я использовать другой проект базы данных (я помню, что у меня есть выбор, когда между "Database project" и "Server project", но я не знаю, имеет ли это значение)?
ИЗМЕНИТЬ
Я могу переопределить .sqlcmdvars просто отлично, но это не решает проблему. Это извлечение из сгенерированного файла .sql с помощью команды, описанной выше:
GO
:setvar DatabaseName "TargetDB"
:setvar DefaultDataPath "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\"
Таким образом, целевая база данных "targetdb" записывается правильно. Но еще несколько строк:
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 - это имя исходной базы данных (т.е. db, где мы развертываем во время разработки, и которая задается в свойствах проекта проекта базы данных). В этом случае развертывание завершается неудачно, потому что этот точный путь может отличаться на целевой машине или на моей машине, потому что этот db уже существует.
Эти значения просто выглядят жестко закодированными в сгенерированном script.