Здесь описано несколько подходов: Условная логика в скрипте PostDeployment.sql с использованием SQLCMD
После попытки всех опций, тот, который работал для меня, использовал событие сборки.
Используя этот метод, я настроил проект для использования пустого сценария в качестве сценария предварительной установки, а затем заменил его на правильный сценарий перед сборкой (отладка для On-Premises и выпуск для Azure).После сборки сценарий-заполнитель копируется обратно, чтобы избежать передачи измененного файла в систему контроля версий.
Вот структура папок:
В файле проекта я добавил следующие цели BeforeBuild и AfterBuild:
<Target Name="BeforeBuild">
<Copy Condition=" '$(Configuration)' == 'Debug' " SourceFiles="Pre-Deployment\OnPremises.PreDeploymentScript.sql" DestinationFiles="Pre-Deployment\PreDeploymentScript.sql" OverwriteReadOnlyFiles="true" />
<Copy Condition=" '$(Configuration)' == 'Release' " SourceFiles="Pre-Deployment\Azure.PreDeploymentScript.sql" DestinationFiles="Pre-Deployment\PreDeploymentScript.sql" OverwriteReadOnlyFiles="true" />
</Target>
<Target Name="AfterBuild">
<Copy SourceFiles="Pre-Deployment\Empty.PreDeploymentScript.sql" DestinationFiles="Pre-Deployment\PreDeploymentScript.sql" OverwriteReadOnlyFiles="true" />
</Target>
Сценарий предварительного развертывания Azure создает внешний источник данных (в отдельном сценарии, который здесь не показан) ивнешние таблицы:
IF (NOT EXISTS(SELECT * FROM sys.tables WHERE NAME = 'MyExternalTable' AND is_external = 1))
BEGIN
PRINT 'Creating external table: MyExternalTable'
CREATE EXTERNAL TABLE [MySchema].[MyExternalTable](
[Id] [int],
[Name] [nvarchar](3000) NOT NULL
)
WITH
(
DATA_SOURCE = [ExternalDataSourceName]
);
PRINT 'Created external table: MyExternalTable'
END
ELSE
BEGIN
PRINT 'External table ''MyExternalTable'' is already created'
END
GO
В то время как локальные данные просто создают некоторые синонимы:
IF NOT EXISTS(SELECT * FROM sys.synonyms WHERE name = 'MyExternalTable')
BEGIN
CREATE SYNONYM [MySchema].[MyExternalTable] FOR [OtherDb].[OtherSchema].[OtherTable]
END
Представления затем могут беспрепятственно использовать это, не зная, получают ли они данные извнешняя таблица, использующая внешний источник данных, или синоним, ссылающийся на другую базу данных на том же сервере:
CREATE VIEW [dbo].[MyView] AS SELECT * FROM [Myschema].[MyTable]
Несмотря на то, что она выглядит немного неуклюжей, она работает довольно хорошо и позволяет использовать один проект базы данных дляразвертывание как на локальном, так и на Azure SQL Server.