You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 14:37:24