含Azure AD用户的Azure SQL Database部署.bacpac报错咨询
部署包含Azure AD用户的.bacpac文件到Azure的解决方案
问题根源
Azure AD用户的SID为GUID字符串格式,而SQL Server针对AD用户的CREATE USER语句无需指定SID。但SSMS导出的.bacpac文件中,错误地为AD用户生成了带SID = <ID>的创建脚本,导致部署时触发Supplied parameter sid should be binary(16)错误。
解决方法
方法一:导出时排除Azure AD用户
- 用SSMS导出.bacpac时,进入高级设置,在排除对象中勾选所有Azure AD用户,仅导出数据库结构和数据。
- 部署完成后,手动在目标数据库重建Azure AD用户及权限:
-- 创建AD用户 CREATE USER [ADUser] FROM EXTERNAL PROVIDER; -- 分配角色示例 ALTER ROLE db_datareader ADD MEMBER [ADUser];
方法二:修改.bacpac文件中的脚本
- 将.bacpac文件重命名为
.zip,解压到本地目录。 - 打开解压后的
model.xml文件,搜索所有包含TYPE = E的CREATE USER语句(对应Azure AD外部用户)。 - 删除语句中的
WITH SID = <ID>,部分,修改为标准格式:CREATE USER [ADUser] FROM EXTERNAL PROVIDER; - 保存修改后的
model.xml,重新打包为.zip文件,再改回.bacpac后缀。 - 使用修改后的文件进行部署。
方法三:部署时跳过用户匹配错误(应急方案)
使用Azure CLI部署时,添加参数忽略用户登录不匹配的错误,部署后手动重建用户:
az sql db import -g <资源组名> -s <服务器名> -n <数据库名> --storage-key <存储账户密钥> --storage-key-type StorageAccessKey --storage-uri <bacpac文件存储地址> --admin-user <管理员账户> --admin-password <管理员密码> --parameters "{'CommandLineParameters':'/p:IgnoreUserLoginMismatch=True'}"
注意事项
- 部署完成后必须验证Azure AD用户的权限配置,确保业务正常访问。
- 若目标数据库与源数据库属于不同Azure AD租户,需确保用户在目标租户中已存在。
内容的提问来源于stack exchange,提问作者jairo buitrago
相关产品推荐
相关产品推荐

