Доступ к переменным сборки внутри сценариев развертывания до и после SSDT - PullRequest
0 голосов
/ 02 мая 2019

Я только что настроил проект SSDT, который хочу использовать для создания локальных баз данных на сервере SQL, размещенном локально на моей машине.

Я хочу добавить несколько сценариев SQL до и после развертывания для инициализации и очистки.

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

Однако я не могу получить к ним доступ в сценариях после развертывания.

Синтаксис ниже не будет строить проект -

use [$(TargetDatabaseName)]

Эта сборка выполняется, но при публикации происходит сбой -

use ['$(TargetDatabaseName)']

и ошибка говорит о том, что '' myTargetDB '' не существует (myTargetDB был передан в качестве значения во время публикации)

Это может быть тривиальной вещью, но я просто не могу обойти это. Я на SQL Server 2016, если это имеет значение.

Ответы [ 2 ]

0 голосов
/ 02 мая 2019

Существует предопределенная переменная $(DatabaseName) для имени целевой базы данных. Вам не нужно создавать свои собственные; и даже если вы это сделаете, вам придется установить одинаковое значение для них обоих.

Не уверен насчет целевого сервера. В большинстве случаев сценарии SQL генерируются при условии, что соединение с правильным сервером уже установлено. Конечно, вы можете изменить текущий сервер, используя что-то вроде :connect $(TargetServerName), но я думаю, что это приведет только к путанице (и я не уверен, что это будет работать на самом деле).

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

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

use [master];
go

print 'Switching database ownership to sa...';
GO
alter authorization on database::[$(DatabaseName)] to [sa];
go


use [$(DatabaseName)];
go

print 'Creating database master key...';
go

-- Create database master key
create master key encryption by password = '$(DMK_Key)';
go

print 'Running database setup...';
go
exec dbo.init_database;
go

Возможно, однако, что вы пытаетесь сослаться на другую базу данных, расположенную на другом сервере. Если это так, вам нужно следовать другому подходу, а именно: создать проект для этой удаленной базы данных и добавить его DACPAC в список ссылок на проекты, используя меню Add database reference.... Там вы сможете указать переменные как для (связанного) сервера, так и для имени базы данных.

0 голосов
/ 02 мая 2019

Убедитесь, что оба сценария переведены в режим SQLCMD. Смотрите изображение ниже, окруженное красным.

enter image description here

После определения целевой переменной, см. Окружение синим цветом на изображении выше, ее можно безопасно использовать в сценарии PostDeployment, см. Изображение ниже, окруженное синим цветом. enter image description here

Если у вас есть какие-либо вопросы, не стесняйтесь обращаться ко мне.

...