资讯动态

Drizzle Kit 0.27.1 修复解读:RLS 策略与视图并存时的 SQL 语句生成顺序问题

发布时间:2026/9/19 6:40:07 来源:尧图企业网站定制
Drizzle Kit 0.27.1 修复解读RLS 策略与视图并存时的 SQL 语句生成顺序问题【免费下载链接】drizzle-ormORM项目地址: https://gitcode.com/gh_mirrors/dr/drizzle-orm本篇技术指南围绕 Drizzle Kitdrizzle-kit0.27.1 版本的单一修复条目展开当 Postgres 项目中同时使用 Row-Level SecurityRLS策略与视图时生成的 SQL 语句中视图会被排到语句序列末尾。文章将结合 0.27.1 变更日志 与仓库源码还原问题现象、定位生成顺序的根源并说明修复后的语句编排逻辑帮助你在升级到 0.27.1 后正确理解push/generate产出的 DDL 顺序。版本背景从 0.27.0 引入 RLS 到 0.27.1 修复顺序Drizzle Kit 0.27.0 正式引入了 Postgres 行级安全RLS支持包括.enableRLS()表级开关、pgPolicy策略定义与pgRole角色管理并原生兼容 Neon、Supabase 等数据库服务商。该版本说明可参见 0.27.0 变更日志。然而在 0.27.0 中暴露出一个与 RLS 策略和视图共存相关的问题即 issue #3378当使用 RLS 策略policies与视图views时视图成为最后生成的子句the view is the last clause generated。0.27.1 的唯一变更就是修复该问题Fix: [BUG]: When using RLS policies and Views, the view is the last clause generated见 changelogs/drizzle-kit/0.27.1.md问题本质DDL 语句的组装顺序失控Drizzle Kit 在计算两个 schema 快照的差异后会将结果统一组装为「JSON 语句数组」jsonStatements再交给 SQL 生成器逐条翻译成可执行 DDL。语句在数组中的顺序直接决定了最终迁移文件或push输出中 SQL 的先后顺序。以 Postgres 方言为例语句的最终编排发生在 drizzle-kit/src/snapshotsDiffer.ts 的generatePgJsonStatements函数中。从修复后的代码可以看到明确的顺序约定jsonStatements.push(...createViews); // 视图创建位于最前 jsonStatements.push(...jsonRenamePoliciesStatements); // 策略重命名 jsonStatements.push(...jsonDropPoliciesStatements); // 策略删除 jsonStatements.push(...jsonCreatePoliciesStatements); // 策略创建 jsonStatements.push(...jsonAlterPoliciesStatements); // 策略修改 jsonStatements.push(...jsonRenameIndPoliciesStatements); // 独立策略未被链接到表重命名 jsonStatements.push(...jsonDropIndPoliciesStatements); // 独立策略删除 jsonStatements.push(...jsonCreateIndPoliciesStatements); // 独立策略创建 jsonStatements.push(...jsonAlterIndPoliciesStatements); // 独立策略修改上述代码位于 snapshotsDiffer.ts 第 2008-2018 行。可以看到视图创建语句createViews优先入队随后才是与表关联的策略policy语句最后是与角色/策略相关的独立策略ind policy即未被.link()到具体表的策略语句。也就是说修复后的执行顺序为「先建视图再建策略」。而在 0.27.1 修复之前视图创建语句在数组中的位置靠后导致最终生成的 SQL 中「视图出现在策略之后、成为整段脚本的收尾子句」这正是 issue 描述的现象。从 SQL 生成器看两类语句的翻译逻辑jsonStatements中的每个条目最终由 drizzle-kit/src/sqlgenerator.ts 中对应的 Convertor转换器翻译为真实 SQL。视图创建语句视图类型create_view的转换器位于 sqlgenerator.ts 第 755 行附近负责拼出CREATE VIEW含 schema 限定名、WITH 选项、materialized 选项等。视图在语句序列中的位置由上一节展示的jsonStatements.push(...createViews)决定。RLS 策略语句策略相关的转换器包括PgCreatePolicyConvertorcreate_policysqlgenerator.ts 第 209-230 行生成CREATE POLICY name ON schema.table AS ... FOR ... TO ... USING (...) WITH CHECK (...)PgDropPolicyConvertordrop_policysqlgenerator.ts 第 232-245 行生成DROP POLICY ... CASCADEPgRenamePolicyConvertorrename_policy与PgAlterPolicyConvertoralter_policy分别生成ALTER POLICY ... RENAME TO与ALTER POLICY ... USING/WITH CHECKPgEnableRlsConvertor/PgDisableRlsConvertorsqlgenerator.ts 第 359-379 行生成ALTER TABLE ... ENABLE/DISABLE ROW LEVEL SECURITY。其中create_policy的拼装细节体现了 Drizzle 对 Postgres 语法的忠实还原to中的特殊值current_user、current_role、session_user、public不加引号其余角色名自动加双引号using与withCheck仅在存在时才拼接USING (...)/WITH CHECK (...)片段。独立策略的单独处理PgCreateIndPolicyConvertorcreate_ind_policysqlgenerator.ts 第 294-311 行对应未被链接到具体表的策略通过.link()或表中声明之外的用法。在语句编排上独立策略同样被整体放在视图之后snapshotsDiffer.ts 第 2015-2018 行与表级策略保持了「视图在前、策略在后」的一致约定。测试佐证RLS 语句生成的预期输出仓库中的 RLS 测试文件 drizzle-kit/tests/rls/pg-policy.test.ts 展示了策略 RLS 开启时的预期 SQL 序列。例如const schema2 { users: pgTable(users, { id: integer(id).primaryKey(), }, () ({ rls: pgPolicy(test, { as: permissive }), })), };对应的期望输出为ALTER TABLE users ENABLE ROW LEVEL SECURITY; CREATE POLICY test ON users AS PERMISSIVE FOR ALL TO public;这印证了两点实现事实当为表声明策略时RLS 会被自动启用enable_rls语句先行无需手动调用.enableRLS()策略语句生成在表结构语句之后且顺序稳定可断言测试通过diffTestSchemas对比 JSON 语句与 SQL 语句双重校验pg-policy.test.ts 第 21-40 行。视图与策略并存的场景中「视图优先」的顺序正是 0.27.1 修复后的新约定后续如有涉及视图与策略同时变更的 schema生成的 DDL 会稳定保持「先 CREATE VIEW、再策略相关语句」的输出形态。升级与验证建议将drizzle-kit升级到 0.27.1 及以上即可获得该顺序修复0.27.1 对应的drizzle-orm版本要求与 0.27.0 一致RLS 完整能力依赖drizzle-orm0.36.0参见 0.27.0 变更日志。升级后可对同时包含视图与 RLS 策略的项目重新执行一次generate或push观察输出 SQL 中CREATE VIEW是否先于CREATE POLICY/ALTER TABLE ... ENABLE ROW LEVEL SECURITY出现。若使用独立策略.link()到角色而非表内声明注意其语句位于视图与表级策略之后属于正常编排不应视为顺序异常。小结Drizzle Kit 0.27.1 是一个小而关键的修复版本它纠正了 RLS 策略与视图并存时视图被排到语句末尾的问题。通过 snapshotsDiffer.ts 中jsonStatements的入队顺序与 sqlgenerator.ts 中各类 Convertor 的翻译逻辑可以完整理解该修复的机制视图创建语句被前置到策略语句之前保证了 DDL 输出顺序的稳定与可预期也让使用 RLS 的项目在迭代 schema 时拥有更可靠的迁移脚本。【免费下载链接】drizzle-ormORM项目地址: https://gitcode.com/gh_mirrors/dr/drizzle-orm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价