小巧。快速。可靠。
三者取其二。
SQLITE_DBPAGE 虚拟表

1. 概述

SQLITE_DBPAGE 扩展实现了 仅同名虚拟表,通过与 pager 交互提供对底层数据库文件的直接访问。SQLITE_DBPAGE 能够读写数据库的任何页面。由于交互通过 pager 层进行,因此所有更改都是事务性的。

警告:写入 SQLITE_DBPAGE 虚拟表很容易导致不可恢复的数据库损坏。不要允许不受信任的组件访问 SQLITE_DBPAGE 表。使用 SQLITE_DBPAGE 表时请谨慎。在尝试使用 SQLITE_DBPAGE 表之前,请备份重要数据。当 SQLITE_DBCONFIG_DEFENSIVE 标志设置时,将禁用对 SQLITE_DBPAGE 虚拟表的写入。

SQLITE_DBPAGE 扩展包含在 合并 中,但默认情况下处于禁用状态。使用 SQLITE_ENABLE_DBPAGE_VTAB 编译时选项启用 SQLITE_DBPAGE 扩展。SQLITE_DBPAGE 扩展使用未公开的内部接口,并且不可在运行时加载。将 SQLITE_DBPAGE 添加到应用程序的唯一方法是使用 SQLITE_ENABLE_DBPAGE_VTAB 编译时选项编译它。

命令行 shell 的默认版本中启用了 SQLITE_DBPAGE 扩展。

2. 用法

SQLITE_DBPAGE 虚拟表是读/写表,提供对底层磁盘文件的逐页访问。虚拟表似乎具有这样的架构

CREATE TABLE sqlite_dbpage(
  pgno INTEGER PRIMARY KEY,
  data BLOB
);

SQLite 数据库文件分为多个页面。第一个页面是 1,第二个页面是 2,依此类推。没有页面 0。每个页面的大小相同。每个页面的大小是 512 到 65536 之间的 2 的幂。有关更多详细信息,请参阅 文件格式 文档。

SQLITE_DBPAGE 表允许应用程序查看或替换数据库文件中每个页面的原始二进制内容。不会尝试解释页面的内容。内容按原样逐字节返回,就像它出现在磁盘上一样。

SQLITE_DBPAGE 表中数据库文件中的每个页面都对应一行。SQLITE_DBPAGE 允许读取或覆盖页面。但是,数据库文件的大小不能更改。无法通过对该表运行 DELETE 或 INSERT 操作来更改 SQLITE_DBPAGE 表中的行数。

2.1. 在附加的数据库上使用 SQLITE_DBPAGE

上面显示的 SQLITE_DBPAGE 表架构是不完整的。还有一个名为“schema”的第三个 隐藏列,它决定要读取或写入哪个 附加的数据库。由于“schema”列是隐藏的,因此它可以作为参数在将 SQLITE_DBPAGE 作为 表值函数 调用时使用。

例如,假设使用类似于以下语句的语句将另一个数据库附加到数据库连接

ATTACH 'auxdata1.db' AS aux1;

然后要读取该数据库文件的第一个页面,只需运行

SELECT data FROM sqlite_dbpage('aux1') WHERE pgno=1;

如果省略了“schema”,它将默认为主数据库(通常称为“main”,除非使用 SQLITE_DBCONFIG_MAINDBNAME 重命名)。因此,以下两个查询通常是等效的

SELECT data FROM sqlite_dbpage('main') WHERE pgno=1;
SELECT data FROM sqlite_dbpage WHERE pgno=1;

SQLITE_DBPAGE 表可以像任何其他表一样参与联接。因此,要查看所有连接的数据库文件的第一个页面的内容,可以运行类似于以下语句的语句

SELECT dbpage.data, dblist.name
  FROM pragma_database_list AS dblist
  JOIN sqlite_dbpage(dblist.name) AS dbpage
 WHERE dbpage.pgno=1;

此页面最后修改于 2022-01-08 05:02:57 UTC