无法将DACPAC发布到本地SQL Server容器:外部用户登录无效
我们有一个Azure SQL Server数据库,计划通过SQL数据库项目优化CI/CD工作流,流程为从生产数据库生成DACPAC后部署到本地开发容器。已安装Azure Data Studio的Database Projects扩展,Docker正常运行,操作及遇到的问题如下:
- 在Database Projects扩展中从Azure现有生产库创建项目,选择「架构/对象类型」文件夹结构,启用SDK风格项目。
- 构建项目无错误,但产生357条警告,多为对象引用大小写差异(SQL71558)或未解析引用(SQL71502)。
- 发布到本地SQL Server容器时,Deploy dacpac阶段失败,错误信息:
Deploy dacpac: 无法部署包。
Warning SQL0: 指定SQL Server 2019为目标平台的项目可能与SQL Server 2017存在兼容性问题。
Warning SQL0: 源包含依赖外部身份验证提供程序的用户,目标不支持该提供程序,这些用户将被视为无登录名的用户。
Error SQL72014: Core Microsoft SqlClient Data Provider: Msg 15007, Level 16, State 1, Line 1 'DATAFACTORY'不是有效登录名或您无权限。
Error SQL72045: 脚本执行错误。执行的脚本:CREATE USER [DATAFACTORY] FOR LOGIN [DATAFACTORY];
后续将目标平台改为Azure SQL Server,使用Azure SQL Database emulator full镜像发布,仍出现相同错误:
Deploy dacpac: 无法部署包。
Warning SQL0: 源包含依赖外部身份验证提供程序的用户,目标不支持该提供程序,这些用户将被视为无登录名的用户。
Error SQL72014: Core Microsoft SqlClient Data Provider: Msg 15007, Level 16, State 1, Line 1 'DATAFACTORY'不是有效登录名或您无权限。
Error SQL72045: 脚本执行错误。执行的脚本:CREATE USER [DATAFACTORY] FOR LOGIN [DATAFACTORY];
已尝试添加master数据库引用,且在Azure Data Studio、VS Code、Visual Studio 2019中均进行测试。
1. 修复DATAFACTORY用户部署错误
生产库中的DATAFACTORY用户依赖Azure AD等外部身份验证提供程序,本地容器/emulator不支持这类登录,可通过以下方式解决:
- 修改用户定义脚本:找到项目中
Security/Users目录下的DATAFACTORY用户文件,将内容改为无登录名的用户定义:CREATE USER [DATAFACTORY] WITHOUT LOGIN; - 配置发布忽略登录关联:在发布向导的「高级」选项中,勾选「忽略登录名」(对应
IgnoreLoginSids部署参数),避免DACPAC尝试创建关联的外部登录。 - 移除不必要用户:若开发环境无需该用户,直接删除项目中
DATAFACTORY用户的定义文件。
2. 解决目标平台兼容性警告
- 匹配容器/emulator版本:若使用SQL Server 2017容器,将项目目标平台改为SQL Server 2017;若使用Azure SQL emulator,将项目目标平台设为Azure SQL Database(选择对应版本)。
- 清除旧构建文件后重新构建发布,避免缓存的旧DACPAC影响部署。
3. 处理构建阶段警告
- SQL71558(大小写差异):统一项目中对象引用的大小写,与生产库中对象名称的大小写保持一致。
- SQL71502(未解析引用):针对未解析的对象,添加对应数据库引用:
- 在项目右键菜单选择「添加」→「数据库引用」
- 选择系统数据库(如master)或依赖库的DACPAC,确保引用的目标平台与当前项目匹配。
4. 优化发布配置
- 使用容器高权限账户部署:发布到本地容器时,使用SA账户或具有足够权限的SQL身份验证账户,确保能创建用户等对象。
- 简化emulator配置:Azure SQL emulator开发环境建议使用SQL身份验证,避免AD相关配置复杂度。
内容的提问来源于stack exchange,提问作者delicateSchedule

