通过使用sqlpackage.exe提取dacpac并验证架构,我试图验证Server 2016数据库的完整性:
./sqlpackage.exe /DiagnosticsFile:"diagnostics_users.txt`" /Action:Extract /TargetFile: "users.dacpac" /SourceConnectionString:"connstring" /p:VerifyExtraction=true"当我运行它时,我得到输出
Resolving references in schema model
Successfully extracted database and saved it to file但是,当我检查源数据库时,有一个存储过程引用数据库中不存在的表。如果我试图在SSMS中运行它,就会得到错误:Invalid object name '[Old_Database].dbo.VIEWER_LOG'。但是,SqlPackage没有将此标记为错误。
当我在诊断日志中搜索时,我确实看到了以下内容:
Microsoft.Data.Tools.Diagnostics.Tracer Verbose: 1 : ColumnResolver: #34027998 ResolvedDescriptor for column:
ResolvedDescriptor: [DATE_TIME_STAMP]
Potentials(1):
[SqlColumn : P1 - [OLD_DATABASE.dbo.VIEWER_LOG.DATE_TIME_STAMP]]
Available Column Sources:
ColumnSource VIEWER_LOG (affinity = 1) with no known columns目标数据库上有一个名为Viewer_Log的表,但是由于OLD_DATABASE.DBO不存在,所以没有使用模式OLD_DATABASE.dbo.VIEWER_LOG.DATE_TIME_STAMP。在解析引用时,SqlPackage不应该将其标记为错误吗?是否有可用于检测和标记此配置的配置?
发布于 2020-06-30 21:24:49
我在本文https://www.sqlservercentral.com/forums/topic/create-or-alter-procedure-not-detecting-invalid-object-names-1中找到了答案--基本上,存储过程使用“后期绑定”,它允许在编译时允许不存在的实体,并在运行时进行解析。此链接还提供了一个有用的SQL脚本来检测这些问题。
此外,我还创建了一个部署后脚本,可以在SSDT中使用该脚本在部署之后验证给定的数据库没有未解决的引用( https://gist.github.com/DarylSmith/ff69ee75dc1bb61af44dc9b9d9e00d7a )。
https://dba.stackexchange.com/questions/269975
复制相似问题