第 09 章只读模式
只读模式是「按连接」的一个开关。打开以后,这个连接上的所有写操作都被禁用, 编辑能力整个关掉。它用来解决一个具体的问题:别手滑改坏生产库。
为什么需要它
TablePlus 那类工具有一个更重的保护机制:每次写操作都要求重新输入数据库密码。 那个方案确实有效,但每次改个数据都要输密码,用起来很烦。
TableLite 用一个更轻的替代:把生产连接的编辑能力整个关掉。
想看数据就看,想跑 SELECT 就跑,但改不了。
真要改的时候,去连接菜单里把开关关掉——这一步足够让你意识到自己在做什么。
它不是权限控制
只读模式只做语句级别的拦截,是给「不会故意搞破坏的自己」用的护栏,
不是安全边界。真正的安全边界应该由数据库账号权限保证——
给这个连接配一个只有 SELECT 权限的账号,那才是拦得住人的做法。
在哪里开关
| 位置 | 操作 |
|---|---|
| 连接配置表单 → 基本信息 | 勾上「只读」 |
| 打开连接后 | 菜单「连接 → 只读模式」,随时可以切换,不用重连 |
这个状态保存在连接配置里,下次打开这个连接仍然生效。
只读的视觉标识
只读连接在界面上有五处标识,随便瞟一眼都能看出来。这是刻意的重复—— 防的就是「我以为自己在测试库上」。
| 位置 | 表现 |
|---|---|
| 连接列表 | 名称前显示锁图标 🔒,摘要末尾追加 · 只读 |
| 连接切换器 | 名称前显示锁图标 🔒 |
| 工具栏颜色带 | 用连接颜色着色(生产建议设红色) |
| 状态栏 | 连接信息末尾追加 · 只读,用醒目颜色 |
| 标题栏 | 显示 连接名(只读) |
被禁止的操作
表数据视图
- 右侧字段栏仍会列出这一行的字段和值,但所有编辑器禁用,栏顶写明原因:
该连接处于只读模式 - 不能插入、复制、删除行
- 「提交」按钮禁用,悬停提示
该连接处于只读模式,无法提交修改 - 「放弃」按钮仍然可用——如果你之前积累过改动,还是得能丢掉它们
- 双击单元格改为打开快速查看
对象树
截断表、删除表直接禁用(这两项本来就不进暂存区)
导入
- CSV 导入功能禁用
- 「导入到新表」也禁用
表结构视图
不受影响——它本来就是只读的。
SQL 编辑器里的拦截
执行前会检查每条语句的类型,只允许这四类:
| 允许 | 说明 |
|---|---|
SELECT | |
SHOW | |
EXPLAIN / DESCRIBE / DESC | |
WITH 开头的查询 | 前提是最终是查询而不是写操作 |
| 拒绝 | 说明 |
|---|---|
INSERT / UPDATE / DELETE / REPLACE | |
CREATE / ALTER / DROP / TRUNCATE / RENAME | |
GRANT / REVOKE | |
LOAD DATA | 会往表里灌数据 |
CALL | 存储过程内部可能写数据,无法预知,所以一律拒绝 |
SET | 可能改变会话状态,影响后续语句的语义 |
LOCK / UNLOCK |
混合脚本怎么处理
- 安全的语句正常执行,各有自己的结果标签。
- 被拒绝的语句在结果标签里标红,标签文字是
只读拦截。 - 被拒绝的语句不会中断后续安全语句的执行——所以一个迁移脚本里的
SELECT部分仍然能看到结果。
关闭只读模式
菜单「连接 → 只读模式」取消勾选。取消后立即生效,不需要重连。 但因为这是「解除保护」的动作,会给一次轻确认,防止手滑:
提示文案汇总
| 场景 | 文案 |
|---|---|
| 进入只读连接 | 该连接处于只读模式,所有写操作已被禁用。 |
| 悬停被禁用的提交按钮 | 该连接处于只读模式,无法提交修改 |
| SQL 编辑器工具栏常驻 | 只读模式:仅允许 SELECT / SHOW / EXPLAIN / DESC |
| 语句被拦下 | 当前连接处于只读模式,只能执行查询语句。如需修改,请在连接菜单中关闭只读模式。 |
| 表数据视图不可编辑的原因 | 状态栏显示 该连接处于只读模式,同时字段栏顶部也写明这一句 |
已知限制
两道没拦住的口子
-
存储过程 / 函数内部的行为无法拦截。
一个
SELECT my_func()里如果偷偷写了数据,只读模式看不出来。 这就是为什么CALL会被一律拒绝——能拦的只有语句本身。 - 它不是权限控制。 真要防住误操作甚至是误用,去数据库上给这个连接配一个只有只读权限的账号。 两个一起用最稳:账号层面拦得住,界面层面拦得早。