我们正在使用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总是将变量显示为与数据库的差异。
理想情况下,您需要包括所有数据库作为对项目的引用(右键单击该项目并执行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
变量的值并将其更改为所需的值。之后,您可以选择保存此设置(另存为),保存的结果称为“发布配置文件”。因此,对于每个环境,您只需要创建不同的发布配置文件并在发布更改时使用它即可。
[您可能想先尝试从同义词开始,它可能可以工作(需要验证),但是我还是建议添加数据库引用。