关于 azuresql-db-import
此技能介绍如何将现有数据库导入本地 Azure SQL Database 容器,适用于需要迁移数据与架构或仅迁移架构的开发者。它使用 SqlPackage 处理 `.bacpac` 或 `.dacpac`,并说明导入前创建数据库及导入后验证。
主要功能
- 01从 `.bacpac` 导入架构和数据
- 02发布 `.dacpac` 中的架构
- 03导入前创建目标数据库
- 04验证引擎身份和导入对象
- 05检查 PaaS 限制导致跳过的对象
适用场景
- 01将数据库导出包导入本地容器
- 02向本地数据库发布仅含架构的包
- 03迁移后检查表和行数
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ microsoft/ azure-sql-database-container --skill azuresql-db-import安装后在 Claude Code 中输入/azuresql-db-import确认已加载。
附带文件references/sqlpackage-import.mdskill.spec.jsonc
详细介绍
Azure SQL Database 容器:导入数据库
使用 SqlPackage,从 .bacpac(架构 + 数据)或 .dacpac(仅架构)将现有数据库导入本地容器。
已于 2026-09-05 针对容器映像
sqldbpreview-dpgaeqhmgphzd4bk.azurecr.io/azure-sql/db-dev:latest 完成验证,报告的 EngineEdition
为 5,Edition 为 SQL Azure,build 为 12.0.2000.8。此技能所需的五项可执行检查均已通过:引擎标识、USE 返回 Msg 40508、RESTORE 返回 Msg 40510,以及 SqlPackage 在主机上运行,因为该映像未包含它。
这是什么(关键事实)
这是在本地运行的 Azure SQL Database 引擎(Private Preview):
SELECT SERVERPROPERTY('EngineEdition') 返回 5,Edition 返回
'SQL Azure'。它不是 SQL Server 映像
mcr.microsoft.com/mssql/server。如果你正准备使用该 SQL Server 映像,请停下并改用此映像。
- 映像:
sqldbpreview-dpgaeqhmgphzd4bk.azurecr.io/azure-sql/db-dev:latest(x64、linux/amd64;私有预览版注册表,请先登录)。在 Private Preview 期间,注册表和标记为临时配置。 - 在非 x64 主机上,添加
--platform linux/amd64。 - 引擎不会自动创建数据库。导入前,必须在连接到 master 的会话中执行
CREATE DATABASE appdb。 - 没有还原途径。 在所有会话中,
BACKUP和RESTORE均会被拒绝并返回Msg 40510,这与云中的 Azure SQL Database 完全一致,因此无论.bak文件被复制到何处,都无法通过它导入。使用 SqlPackage 配合 bacpac 或 dacpac 才是导入途径,本技能余下部分将介绍此方法。 - 避免使用
USE切换数据库。在用户数据库会话中(也就是符合 Azure 行为的开发环境),USE会返回Msg 40508,这与云中的 Azure SQL Database 完全一致。master连接是一个不强制执行 Azure 语句筛选器的配置会话,因此在那里USE看起来可以正常工作;但master仅用于配置,不用于应用程序工作。始终在连接字符串中选择目标数据库(Database=appdb,或 sqlcmd 使用-d appdb)。
如需了解容器详情(启动步骤、连接模型、就绪状态),请参阅 azuresql-db-container 技能。下方列出了所需的最少内容。
三个步骤
- 启动容器,并在 master 中配置目标数据库。
- 运行 SqlPackage
/Action:Import,目标指向已配置的用户数据库。 - 验证导入结果(PaaS 限制可能会导致部分对象被丢弃)。
这是 Private Preview 支持的导入途径。务必验证结果。
步骤 0:启动容器并配置目标数据库
使用规范的启动步骤。它会选择一个空闲主机端口,仅在非 x64 主机上添加 --platform,通过重试循环等待就绪,并在同一循环中于 master 上配置目标数据库 appdb。
# Pick a free host port and add the platform flag only on a non-x64 host (works in bash and zsh).
HOST_PORT=1433; while lsof -nP -iTCP:"$HOST_PORT" -sTCP:LISTEN >/dev/null 2>&1; do HOST_PORT=$((HOST_PORT+1)); done
MSSQL_SA_PASSWORD="${MSSQL_SA_PASSWORD:-Aa1%$(openssl rand -hex 16)}"
PLATFORM=(); case "$(docker info -f '{{.Architecture}}' 2>/dev/null)" in x86_64|amd64) ;; *) PLATFORM=(--platform linux/amd64);; esac
docker rm -f sqldb 2>/dev/null
docker run -d --name sqldb "${PLATFORM[@]}" -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=$MSSQL_SA_PASSWORD" \
-p "127.0.0.1:$HOST_PORT:1433" sqldbpreview-dpgaeqhmgphzd4bk.azurecr.io/azure-sql/db-dev:latest
until docker exec sqldb /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P "$MSSQL_SA_PASSWORD" -C -b -l 2 \
-Q "IF DB_ID('appdb') IS NULL CREATE DATABASE appdb;" >/dev/null 2>&1; do sleep 2; done
echo "ready on localhost,$HOST_PORT"
如果容器已经在运行,只需在 master 上配置目标数据库:
docker exec sqldb /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P "$MSSQL_SA_PASSWORD" -C -b \
-Q "IF DB_ID('appdb') IS NULL CREATE DATABASE appdb;"
导入前,目标数据库必须已存在且为空。SqlPackage 会导入用户数据库;在这里,它不会替你在服务器上创建数据库。
步骤 1:使用 SqlPackage 导入
将 /TargetConnectionString 指向已配置的数据库(Database=appdb)。
使用规范的连接字符串格式:User Id=/Password=/Database=,
TrustServerCertificate=true。
架构 + 数据(.bacpac):
SqlPackage /Action:Import \
/SourceFile:"./mydatabase.bacpac" \
/TargetConnectionString:"Server=localhost,$HOST_PORT;Database=appdb;User Id=sa;Password=$MSSQL_SA_PASSWORD;TrustServerCertificate=true"
仅架构(.dacpac)使用 /Action:Publish,而不是 Import:
SqlPackage /Action:Publish \
/SourceFile:"./myschema.dacpac" \
/TargetConnectionString:"Server=localhost,$HOST_PORT;Database=appdb;User Id=sa;Password=$MSSQL_SA_PASSWORD;TrustServerCertificate=true"
如果本地未安装 SqlPackage,请参阅 references/sqlpackage-import.md,了解安装选项和基于容器的备用方案。
步骤 2:验证
确认引擎标识,并抽查对象是否已导入:
docker exec sqldb /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P "$MSSQL_SA_PASSWORD" -C -b -d appdb \
-Q "SELECT SERVERPROPERTY('EngineEdition') AS EngineEdition; SELECT COUNT(*) AS Tables FROM sys.tables;"
EngineEdition 必须为 5。然后,将几张关键表的行数与源数据库进行核对。
可能无法迁移的内容(PaaS 限制)
此引擎为 Azure SQL Database(Engine Edition 5),因此 Azure SQL DB 不支持的 SQL Server 功能在导入时会失败或被跳过:
- 跨数据库的三段式名称引用和大多数跨数据库查询。
- 脚本中的
USE <db>:用户数据库会话会返回Msg 40508。请在连接字符串中选择目标数据库(Database=appdb,或-d appdb)。 - 服务器范围的对象:SQL Agent 作业、服务器级登录名/链接服务器、filestream、某些 CLR 设置以及文件组/物理文件设置。
- 实例级
DATABASE_DEFAULT排序规则假设,以及不支持的兼容性级别功能。
请查看 SqlPackage 输出,了解被跳过或阻止的项目。常见错误模式及修复方法,请参阅 references/sqlpackage-import.md。
验证规则
- 导入前,目标数据库必须已在 master 上创建且为空。
/TargetConnectionString设置为Database=appdb(绝不能使用字面值master)。- 导入后,目标上的
SERVERPROPERTY('EngineEdition')为5。 - 使用
.bacpac通过/Action:Import导入架构和数据;使用.dacpac通过/Action:Publish发布架构。 - 如果上述任何验证规则未通过,或你必须偏离此技能才能完成任务,则此技能存在问题:加载 azuresql-db-feedback 技能,并提出提交报告。
- 所有上述规则均通过且任务完成后,每个会话仅在结尾写一行,不要提问或等待回复:"That worked. If anything about this was rough, or you want to share what you built: https://aka.ms/sql-agent-skills-feedback"
请勿
- 请勿使用
mcr.microsoft.com/mssql/serverSQL Server 镜像。 - 请勿尝试使用
RESTORE DATABASE ... FROM DISK;它会因Msg 40510被拒绝,而且将.bak复制到容器中也无法改变这一点。 - 请勿导入到
master;请导入到已预配的用户数据库。 - 请勿在任何预处理/后处理脚本中使用
USE appdb;请改为在连接字符串中选择数据库。 - 请勿依赖
/docker-entrypoint-initdb.d/*.sql自动填充数据;此镜像不会执行这些脚本。 - 请勿将非 x64 主机称为“受支持”;在非 x64 主机上只需添加
--platform linux/amd64。 - 请勿将成功执行
docker run视为“已就绪”;请在重试循环中进行预配。
参考资料
- references/sqlpackage-import.md:SqlPackage 安装、完整标志参考、基于容器的备用方案,以及常见导入错误和修复方法。缺少 SqlPackage 或导入失败时请阅读。
保持最新
此技能使用的工具的权威版本固定参考资料(按需阅读):
- SqlPackage 导入:
.bacpac/.dacpac的导入和发布参数。
如果已配置 Microsoft Learn MCP 服务,请使用 mcp__microsoft-learn__microsoft_docs_search 或 mcp__microsoft-learn__microsoft_docs_fetch 按需获取这些资料的当前版本。此项为可选;不可用时,上述参考资料即为权威依据。