部署内存数据库表变更时遇SCHEMABINDING依赖问题求助
内存表关联带NATIVE_COMPILATION和SCHEMABINDING的函数时,SqlPackage.exe部署失败的解决方法
问题背景
我们的自动化部署流程同时覆盖内存数据库和常规数据库:先构建生成dacpac包,再通过SqlPackage.exe执行部署。最近给内存数据库的表新增列时遇到异常——该表关联了同时设置NATIVE_COMPILATION和SCHEMABINDING选项的函数。
问题原因
SqlPackage.exe处理SCHEMABINDING锁时,直接套用了常规数据库中非原生编译函数的逻辑,生成的部署脚本包含以下错误步骤:
- 先修改函数移除
SCHEMABINDING选项,但保留NATIVE_COMPILATION - 修改目标表
- 重新为函数添加
SCHEMABINDING选项
但原生编译(NATIVE_COMPILATION)函数必须强制搭配SCHEMABINDING选项,脚本里只保留NATIVE_COMPILATION的写法本身不合法,直接导致部署执行失败。
生成的错误脚本片段(已混淆)
GO PRINT N'Removing schema binding from [my].[fn]...'; GO ALTER FUNCTION my.fn (@bar INT NULL) RETURNS TABLE WITH NATIVE_COMPILATION -- 此处选项组合非法 AS RETURN SELECT t.id FROM dbo.altered_table AS t WHERE t.foo = @bar GO PRINT N'Altering Table dbo.altered_table...'; GO ALTER TABLE dbo.altered_table ADD new_col INT NULL; GO PRINT N'Adding schema binding to my.fn...'; GO ALTER FUNCTION my.fn (@bar INT NULL) RETURNS TABLE WITH NATIVE_COMPILATION, SCHEMABINDING AS RETURN SELECT t.id FROM dbo.altered_table AS t WHERE t.foo = @bar GO
当前临时方案的不足
目前我们用的临时方法是手动写预部署脚本删除所有阻塞依赖,部署完成后再恢复这些函数,但这个方案操作繁琐,还容易因遗漏依赖导致后续问题。
可行解决方案/规避方法
方法1:尝试SqlPackage.exe的智能默认参数
给SqlPackage.exe添加/p:GenerateSmartDefaults=True参数,强制工具生成更适配原生编译对象的部署逻辑,测试是否能自动修正选项组合的问题。
方法2:自定义脚本修正生成的部署内容
通过脚本(PowerShell/批处理)对SqlPackage.exe生成的部署脚本做文本替换,把错误的函数修改逻辑替换成合法的删除-重建流程:
- 移除原脚本中“移除SCHEMABINDING”的
ALTER FUNCTION语句 - 改为先删除该原生编译函数
- 修改表之后,重新创建带
NATIVE_COMPILATION,SCHEMABINDING的函数
修正后的示例脚本逻辑:
GO PRINT N'Dropping native compiled function [my].[fn]...'; GO DROP FUNCTION my.fn; GO PRINT N'Altering Table dbo.altered_table...'; GO ALTER TABLE dbo.altered_table ADD new_col INT NULL; GO PRINT N'Recreating native compiled function [my].[fn]...'; GO CREATE FUNCTION my.fn (@bar INT NULL) RETURNS TABLE WITH NATIVE_COMPILATION, SCHEMABINDING AS RETURN SELECT t.id FROM dbo.altered_table AS t WHERE t.foo = @bar GO
方法3:升级SqlPackage.exe版本
检查微软是否已发布修复该bug的版本,尝试升级到最新版的SqlPackage.exe(比如16.x系列的后续更新版本),确认是否已修复原生编译函数的SCHEMABINDING处理逻辑。
相关版本信息
- SqlPackage.exe版本:16.0.5400.1、162.0.52
- SqlServer版本:Microsoft SQL Server 2019 (RTM-CU19) (KB5023049) - 15.0.4298.1 (X64)
- 目标数据库兼容级别:150
- 环境:独立服务器(非Azure)
内容的提问来源于stack exchange,提问作者IVNSTN
相关产品推荐
相关产品推荐

