Подтвердить что ты не робот

Развертывание базы данных (vsdbcmd.exe): DatabaseName и DefaultDataPath игнорируются?

Версия базы данных 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.

4b9b3361

Ответ 1

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

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

Отредактируйте найденные файлы...

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

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

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

Счастливое кодирование.

Ответ 2

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

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

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

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

ЕСЛИ НЕ СУЩЕСТВУЕТ (SELECT 1 FROM dbo.sysfiles WHERE name = 'fgdb_data') НАЧАТЬ ALTER DATABASE [$ (databasename)] ДОБАВИТЬ ФАЙЛ ( NAME = N'fgdb_data ', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\fgdb_data.ndf ', MAXSIZE = 100 МБ, FILEGROWTH = 10 МБ ) ДЛЯ ФИЛЕРОУПА [ТАБЛИЦЫ] END

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

: setvar drive "C:" : каталог setvar "Программные файлы \Microsoft SQL Server\MSSQL.1\MSSQL\DATA"

ЕСЛИ НЕ СУЩЕСТВУЕТ (SELECT 1 FROM dbo.sysfiles WHERE name = 'fgdb_data') НАЧАТЬ ALTER DATABASE [$ (databasename)] ДОБАВИТЬ ФАЙЛ ( NAME = N'fgdb_data ', FILENAME = N '$ (диск)\$(каталог)\fgdb_data.ndf', MAXSIZE = 100 МБ, FILEGROWTH = 10 МБ ) ДЛЯ ФИЛЕРОУПА [ТАБЛИЦЫ] END

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

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