SQLProj构建报错:计算列依赖Always Encrypted列,求Schema Compare解决方案
问题:Schema Compare误报加密列依赖计算列错误及替代方案
问题背景
现有如下表结构:
CREATE TABLE [dbo].[LawFirm] ( [LawFirmId] INT IDENTITY (1, 1) NOT NULL, [EntityId] INT NOT NULL, [Name] VARCHAR (100) NOT NULL, [Description] VARCHAR (2000) NULL, [EIN] VARCHAR (15) COLLATE Latin1_General_BIN2 ENCRYPTED WITH ( COLUMN_ENCRYPTION_KEY = [CEK_AZ_EIN], ALGORITHM = N'AEAD_AES_256_CBC_HMAC_SHA_256', ENCRYPTION_TYPE = DETERMINISTIC ) NULL, [PhoneNumber] VARCHAR (30) NULL, [AddressId] INT NULL, [EINOnFile] AS CASE WHEN EIN IS NULL THEN CAST(0 AS BIT) ELSE CAST(1 AS BIT) END PERSISTED, PRIMARY KEY CLUSTERED ([LawFirmId] ASC), CONSTRAINT [FK__LawFirm__Address__640DD89F] FOREIGN KEY ([AddressId]) REFERENCES [dbo].[Address] ([AddressId]), CONSTRAINT [FK__LawFirm__EntityI__6501FCD8] FOREIGN KEY ([EntityId]) REFERENCES [dbo].[Entity] ([EntityId]), CONSTRAINT [UQ_LawFirm_EntityId] UNIQUE NONCLUSTERED ([EntityId] ASC) );
使用Visual Studio的Schema Compare时触发如下构建错误:
Error SQL71595:
Column [dbo].[LawFirm].[EIN] cannot be encrypted because the computed column [dbo].[LawFirm].[EINOnFile] depends on it.
Database C:\DEV\GIT\AFFFPortal\Database\dbo\Tables\LawFirm.sql
但该配置在Azure SQL数据库中可正常运行——因为ENCRYPTION_TYPE = DETERMINISTIC(确定性加密)允许计算列对加密列做NULL检查,无密钥权限的用户也能查看EIN是否已存档,且实际创建顺序是先添加加密的EIN列,再创建依赖的EINOnFile计算列。
现在需要解决两个问题:一是如何抑制该错误以正常使用Schema Compare;二是了解替代.sqlproj文件和Schema Compare的方案。
抑制SSDT Schema Compare错误的方法
- 修改项目配置忽略特定错误:直接编辑
.sqlproj文件,在<PropertyGroup>节点中添加<SuppressTSqlErrors>71595</SuppressTSqlErrors>,让SSDT跳过对该错误代码的检查。示例:<PropertyGroup> <!-- 其他现有配置 --> <SuppressTSqlErrors>71595</SuppressTSqlErrors> </PropertyGroup> - 尝试SSDT预览版:如果当前用的是正式版SSDT,可安装Visual Studio的SSDT预览扩展,预览版通常更快适配Azure SQL新特性,可能修复这个误判问题。
- 确认脚本创建顺序:确保项目脚本中EIN列的定义在EINOnFile计算列之前,避免SSDT静态分析误判(用户已按此顺序创建,可再确认脚本文件的编写顺序)。
替代.sqlproj和Schema Compare的方案
- Azure Data Studio (ADS) Schema Compare:ADS的Schema Compare工具对Azure SQL特性支持更及时,能正确识别确定性加密列与依赖计算列的合法关系,不会触发误报。
- SqlPackage.exe命令行工具:脱离Visual Studio UI,直接用SSDT的命令行工具SqlPackage.exe执行schema比较和部署,它的规则检查更贴合Azure SQL实际支持情况,可绕过UI的错误提示。
- 数据库版本控制工具(Flyway/Liquibase):改用基于脚本的版本化管理方案,不依赖
.sqlproj文件,直接用SQL脚本记录schema变更,部署时按顺序执行脚本,完全适配Azure SQL特性,避免SSDT兼容性问题。 - Azure Portal原生比较功能:在Azure Portal中进入目标数据库,使用「Schema compare」功能直接对比本地脚本或源数据库与目标Azure SQL的差异,该功能完全基于Azure SQL规则,不会出现误报。
内容的提问来源于stack exchange,提问作者Alavan
相关产品推荐
相关产品推荐

