Замена имен баз данных переменными в SSDT - PullRequest
0 голосов
/ 05 ноября 2019

Мы используем SSDT для создания конвейера сборки и развертывания с использованием Git и ADO. Для построения решения все перекрестные ссылки на базы данных должны иметь соответствующую ссылку на базу данных в проекте и на них следует ссылаться с помощью [$ (DatabaseVariable)]. Это означает, что каждый раз, когда изменение производится и синхронизируется с помощью Schema Compare, имена баз данных должны заменяться либо вручную, либо с помощью функции поиска и замены. Конечно, существует множество недостатков подхода «найти и заменить», в том числе тот факт, что он будет находить и заменять ссылки в файлах проекта, которые не должны быть переменными базы данных. Я надеюсь, что кто-то знает способ автоматизации этого процесса, который не использует такой метод грубой силы, как поиск и замена.

Я много раз искал это и не нашел ничего полезного.

Вот примерное представление, которое содержит ссылки на несколько баз данных:

CREATE view [Migration].[vwCHILDS_Allegation_Allegation]
as
with src as (
select
    cast('' as nvarchar(50)) CEAllegationIdentifier
    , (select AllegationTypeId from [$(CWNS_Migration)].Allegation.AllegationType where Code = dfrvmi1.DestinationDataFieldReferenceValueCode) AllegationTypeId
    , cast(1 as int) SourceSystemId
    , cast(src.IDNBR as nvarchar(64)) SourceSystemIdentifier
    , src.IDNBR SourceSystemIdentifier_Numeric
    , case when src.CRET_DT_TM = '0001-01-01' then null else src.CRET_DT_TM end SourceSystemCreatedDateTime
    , case when src.MOD_DT_TM = '0001-01-01' then null else src.MOD_DT_TM end SourceSystemModifiedDateTime
    , (
        select
            max(pe.PersonId) 
        from
            [$(CWNS_Migration)].PersonIdentity.PersonIdentifier pe
            join [$(CHILDSDB2)].VLCHA.STAFF_USERID st on cast(st.FK_STAFFFK_PERSID as nvarchar(64)) = pe.Identifier
                and pe.PersonIdentificationSystemId = 4
        where
            st.USERID = ltrim(rtrim(src.MOD_USR_ID))) SourceSystemModifiedPersonId
from
    [$(CHILDSDB2)].VLCHA.ALGTN src
    left join [$(DataCatalog)].dbo.DataFieldReferenceValueMappingInfo dfrvmi1 on dfrvmi1.SourceDataFieldReferenceValueDataFieldId = 216
        and dfrvmi1.SourceDataFieldReferenceValueCode = ltrim(rtrim(src.FK_ALGTN_PRIORICTG))
        and dfrvmi1.DestinationDataFieldReferenceValueDataFieldId = 20605
)
select
    src.*
from
    src
    left join [$(CWNS_Migration)].Allegation.Allegation tgt on tgt.SourceSystemId = src.SourceSystemId and tgt.SourceSystemIdentifier = src.SourceSystemIdentifier
    left join [$(CWNS_Migration)].Quarantine.Allegation q on q.SourceSystemId = src.SourceSystemId and q.SourceSystemIdentifier = src.SourceSystemIdentifier
        and q.QExecutionId = 1
where
    q.QExecutionId is null
    and (
        isnull(src.AllegationTypeId, 0) <> isnull(tgt.AllegationTypeId, 0)
        or isnull(try_cast(src.SourceSystemCreatedDateTime as datetime), '') <> isnull(tgt.SourceSystemCreatedDateTime, '')
        or isnull(try_cast(src.SourceSystemModifiedDateTime as datetime), '') <> isnull(tgt.SourceSystemModifiedDateTime, '')
        or isnull(src.SourceSystemModifiedPersonId, 0) <> isnull(tgt.SourceSystemModifiedPersonId, 0)
    )

Я также надеюсь, что есть способ избежать, чтобы Schema Compare всегда показывал переменные как различия с базой данных.

1 Ответ

0 голосов
/ 07 ноября 2019

В идеале вам нужно включить все базы данных в качестве ссылки на ваш проект (щелкните правой кнопкой мыши на проекте и выберите Добавить ссылку на базу данных или что-то в этом роде). Вы можете сделать это двумя способами: * Создать проект для каждой базы данных и импортировать все или только объекты, используемые вашей базой данных. * Извлечь dacpac из действующей базы данных и использовать его в качестве справочного.

. Затем создать синонимы для каждого. одиночные перекрестные объекты базы данных в вашей основной базе данных. Например, если у нас есть объект [$(CWNS_Migration)].PersonIdentity.PersonIdentifier, вам нужно создать синоним как

CREATE SYNONYM PersonIdentity.PersonIdentifier
    FOR [$(CWNS_Migration)].PersonIdentity.PersonIdentifier;

, а затем использовать PersonIdentity.PersonIdentifier (имя из 2 частей) в вашем коде вместо имен 3-4 частей. Это настройка проекта.

Теперь, когда вы щелкнете правой кнопкой мыши по проекту и нажмете «Опубликовать», появится диалоговое окно, в котором вы можете указать переменную CWNS_Migration и изменить ее на любую другую. нужно. После этого у вас есть возможность сохранить эти настройки (Сохранить как), и результат этого сохранения называется «Опубликовать профиль». Таким образом, для каждой среды вам просто нужно создать свой профиль публикации и использовать его при публикации ваших изменений.

Сначала вы можете попробовать начать с синонимов, это может сработать (нужно проверить), но я бы хотелрекомендуем добавлять ссылки на базы данных в любом случае.

...