从Azure SQL导入bacpac到本地SQL Server遇权限错误求助
问题描述
尝试通过SSMS或sqlpackage.exe导入.bacpac文件至本地SQL Server(含Express版本)时,无论手动操作还是脚本执行均触发相同错误。
执行的导入脚本:
.\SqlPackage.exe /Action:Import /SourceFile:"C:\Backup\mydb.bacpac" /TargetConnectionString:"Data Source=LAPTOP-DELL-DAVE\SQLEXPRESS;Initial Catalog=copyX; Integrated Security=true;Encrypt=False"
报错输出:
Creating deployment plan
Initializing deployment
Verifying deployment plan
Analyzing deployment plan
Importing package schema and data into database
Updating database
*** Error importing database:Could not import package.
Error SQL72014: Core Microsoft SqlClient Data Provider: Msg 4630, Level 16, State 1, Line 1 The permission 'KILL DATABASE CONNECTION' is not supported in this version of SQL Server. Alternatively, use the server level 'ALTER ANY CONNECTION' permission.
Error SQL72045: Script execution error. The executed script:
GRANT KILL DATABASE CONNECTION TO [3d72312312312wo];
已尝试启用包含数据库认证但无效果:
sp_configure 'contained database authentication', 1; GO RECONFIGURE; GO
该问题在SQL Server 2019(版本15)和SQL Server 2022(版本16)中均存在。
原因分析
KILL DATABASE CONNECTION是Azure SQL数据库/托管实例专属的数据库级权限,本地SQL Server全版本均不支持此权限,对应的等效服务器级权限为ALTER ANY CONNECTION。Bacpac文件中包含了针对Azure环境的权限脚本,导致导入本地SQL Server时失败。
解决方案
方案1:提前授予服务器级权限
在执行导入操作前,针对报错中提到的用户([3d72312312312wo])授予服务器级的ALTER ANY CONNECTION权限:
USE master; GO GRANT ALTER ANY CONNECTION TO [3d72312312312wo]; GO
完成导入后,若无需该权限可执行以下语句回收:
USE master; GO REVOKE ALTER ANY CONNECTION FROM [3d72312312312wo]; GO
方案2:修改Bacpac文件中的权限脚本
- 将.bacpac文件重命名为.zip格式并解压。
- 在解压后的文件中找到
model.xml,用文本编辑器打开。 - 搜索所有
GRANT KILL DATABASE CONNECTION语句,替换为GRANT ALTER ANY CONNECTION。 - 将修改后的文件重新打包为.zip,再改回.bacpac后缀。
- 使用修改后的bacpac文件执行导入操作。
内容的提问来源于stack exchange,提问作者goxarad784

