用SSDT中的变量替换数据库名称

我们正在使用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总是将变量显示为与数据库的差异。

avafavaf 回答:用SSDT中的变量替换数据库名称

理想情况下,您需要包括所有数据库作为对项目的引用(右键单击该项目并执行Add database reference或类似的操作)。您可以通过2种方式做到这一点: *为每个数据库创建项目,并导入数据库正在使用的所有或仅对象 *从实时数据库中提取dacpac并将其用作参考

然后为您的主数据库中的每个跨数据库对象创建同义词。例如,如果我们有对象[$(CWNS_Migration)].PersonIdentity.PersonIdentifier,则需要将同义词创建为

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

,然后在代码中使用PersonIdentity.PersonIdentifier(2个部件名称),而不是3-4个部件名称。那是项目的设置。

现在,当您右键单击该项目并执行“发布”时,它将弹出对话框,您可以在其中指定CWNS_Migration变量的值并将其更改为所需的值。之后,您可以选择保存此设置(另存为),保存的结果称为“发布配置文件”。因此,对于每个环境,您只需要创建不同的发布配置文件并在发布更改时使用它即可。

您可能想先尝试从同义词开始,它可能可以工作(需要验证),但无论如何我还是建议添加数据库引用。

本文链接:https://www.f2er.com/3157154.html

大家都在问