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

搭建基于tSQLt的Azure SQL数据库单元测试DevOps环境:本地测试问题求助

解决SQL Server Express与Azure SQL的测试部署兼容问题

环境

  • 搭载Azure SQL的服务器
  • 本地SQL Server Express环境
  • 使用SSDT部署数据库

测试与部署计划

  • [开发人员] 开发阶段在本地SQL Server Express上运行数据库单元测试
  • [DevOps] 代码提交后,流水线运行所有单元测试,全部通过后执行部署

遇到的具体问题

测试1 - SQL Server Express 2019

测试项目部署失败,因Azure SQL使用特定版本tSQLt(1.0.5873.27393),触发错误:

CREATE or ALTER ASSEMBLY for assembly 'tSQLtCLR' with the SAFE or EXTERNAL_ACCESS option failed because the 'clr strict security' option of sp_configure is set to 1.

测试2 - SQL Server Express 2014

查询SELECT @@VERSION显示版本号均为12.0.2000.8,但部署时触发错误:

A project which specifies Microsoft Azure SQL Database v12 as the target platform cannot be published to SQL Server 2014

现有备选方案及顾虑

  1. 搭建两个不同项目,共享测试用例:一个适配Azure SQL的tSQLt版本,一个适配本地SQL Server Express 2019的tSQLt版本,但不确定两者实现差异是否会引发不可预料的错误
  2. 为每位开发人员创建独立Azure SQL实例并行测试,合理性存疑

可行解决方案及优化建议

方案1:调整本地SQL Server Express 2019的CLR安全配置

针对Express 2019的CLR错误,可在本地开发环境执行以下操作:

  1. 启用高级配置选项:
    sp_configure 'show advanced options', 1;
    RECONFIGURE;
    
  2. 临时关闭clr strict security以部署tSQLt:
    sp_configure 'clr strict security', 0;
    RECONFIGURE;
    
  3. 部署完成后,建议重新开启该选项以保持本地环境的安全性:
    sp_configure 'clr strict security', 1;
    RECONFIGURE;
    
    注意:此操作仅适用于本地开发,生产环境必须保持默认安全配置。

方案2:使用SSDT多发布配置适配不同环境

针对Express 2014的目标平台错误,无需切换项目基础设置,只需创建两个SSDT发布配置:

  • 一个配置将目标平台设为SQL Server 2014,用于本地测试部署
  • 另一个配置保持Azure SQL Database v12,用于流水线部署
    开发时选择对应配置即可,避免来回修改项目设置。

方案3:用Docker容器模拟Azure SQL本地环境

彻底规避版本差异问题,使用Azure SQL Edge镜像在本地搭建兼容环境:

  1. 拉取镜像:
    docker pull mcr.microsoft.com/azure-sql-edge
    
  2. 启动容器(替换密码为自定义强密码):
    docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=YourStrong!Passw0rd" -p 1433:1433 --name azuresqledge -d mcr.microsoft.com/azure-sql-edge
    
    该环境与Azure SQL兼容性极高,无需调整tSQLt版本或CLR配置,直接复用流水线的测试逻辑。

方案4:安全适配tSQLt CLR程序集(无需关闭严格安全)

若不想修改CLR全局配置,可为tSQLtCLR程序集添加安全验证:

-- 从tSQLtCLR程序集生成证书
CREATE CERTIFICATE tSQLtCertificate
FROM ASSEMBLY tSQLtCLR;

-- 基于证书创建登录名
CREATE LOGIN tSQLtLogin
FROM CERTIFICATE tSQLtCertificate;

-- 授予程序集 UNSAFE 权限
GRANT UNSAFE ASSEMBLY TO tSQLtLogin;

此方法符合SQL Server 2017+的CLR安全规范,同时兼容Azure SQL的tSQLt版本。

内容的提问来源于stack exchange,提问作者Bill

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 01:38:15