用途:该技能面向 Bitwarden 数据库开发,覆盖数据库架构、迁移与双 ORM 策略,适用于处理 .sql 文件、存储过程、EF 迁移或数据库 schema 的场景。
主要能力:Bitwarden 维护两套数据访问实现,按数据库提供程序划分。MSSQL 使用 Dapper 加存储过程;PostgreSQL、MySQL、SQLite 使用 Entity Framework Core。两者在运行时互斥,但遵循相同的仓储接口。新增仓储功能时需同时实现 Dapper 与 EF Core,除非该功能明确仅限 EF Core(如 Secrets Manager 等商业功能)。以向后兼容方式修改现有存储过程(例如新增带默认值的参数)时,无需改动 EF Core。
迁移设计:Bitwarden Cloud 采用不可回滚的数据库部署方式,服务器部署可回滚,但数据库迁移不可回滚,因此迁移需避免成为停机来源。所有 MSSQL 迁移位于 util/Migrator/DbScripts/,按文件名 YYYY-MM-DD_##_Description.sql 的时间顺序执行。简单增量变更(新增可空列、新表、新存储过程)通常只需一个迁移脚本。util/Migrator/DbScripts_transition/ 与 util/Migrator/DbScripts_finalization/ 当前未使用,可忽略。
存储过程兼容性:非破坏性变更指新增带默认值的参数(如 @NewParam BIT = NULL),现有调用方不受影响,无需 _V2。破坏性变更需 _V2 版本化,包括结果集结构变化、调用模式变化(如单结果集变多结果集)、新增无默认值的必填参数或查询语义不同;做法是创建 ProcedureName_V2 并保留原过程。表级破坏性变更(删列、改类型)通常级联到存储过程,往往需要 _V2 模式。迁移策略复杂且依赖上下文,应始终交由开发者决定;需要数据库变更时,先写迁移脚本并询问开发者是否需要 _V2 版本化或额外步骤。
关键位置:src/Sql/dbo 为主 schema 事实来源;util/Migrator/DbScripts 存放全部迁移(单一文件夹,按时间排序)。
实现分工:实现 Dapper 仓储方法、存储过程或 MSSQL 迁移脚本时,激活 implementing-dapper-queries 技能;实现 EF Core 仓储、生成 EF 迁移或处理 PostgreSQL/MySQL/SQLite 时,激活 implementing-ef-core 技能。
关键规则:迁移文件命名 YYYY-MM-DD_##_Description.sql(如 2025-06-15_00_AddVaultColumn.sql);所有 schema 对象使用 dbo schema,不得在其他 schema 创建对象;约束命名 PK_TableName(主键)、FK_Child_Parent(外键)、IX_Table_Column(索引)、DF_Table_Column(默认值);迁移脚本在 schema 变更前使用 IF NOT EXISTS / IF COL_LENGTH(...) 守卫实现幂等;新增仓储功能需同时提供 Dapper 与 EF Core 实现,除非明确仅限 EF Core 或属于向后兼容的存储过程修改;集成测试使用 [DatabaseData] 特性,会在所有已配置的数据库提供程序上运行测试。
限制:资料未提供该技能的安装命令、收费方式、平台支持与具体使用步骤,暂未提供。