为何只读操作触发‘attempt to write a readonly database’错误?
问题原因与解决办法
核心原因
SQLite 即便执行 .tables、普通查询这类看似只读的操作,也会默认尝试以读写模式打开数据库,同时会尝试在数据库所在目录创建临时日志文件(比如写前日志WAL或回滚日志)。如果数据库文件本身或其所在目录没有写入权限,就会触发"attempt to write a readonly database"错误——哪怕你的操作本身不修改数据。
另外,select * from t_I_dont_know_if_this_table_exists; 触发的"Parse error"是伴随前面写错误出现的次生问题,根源还是读写模式下的权限不足。
解决步骤
直接以只读模式打开数据库,跳过SQLite的写权限检查:
sqlite3 -readonly /nix/var/nix/db/db.sqlite
打开后再执行 .tables 或查询语句,就不会再触发权限错误了。
补充说明
Nix的数据库文件 /nix/var/nix/db/db.sqlite 本身属于root用户,普通用户仅有读权限,且所在目录也没有普通用户的写入权限,这是Nix的安全设计。必须显式指定只读模式,才能让SQLite放弃尝试写操作相关的权限验证。
内容的提问来源于stack exchange,提问作者Pierre-olivier Gendraud
相关产品推荐
相关产品推荐

