SQLITE_DBPAGE扩展实现了一个仅使用虚拟名称的虚拟表,该虚拟表通过与分页器进行交互来提供对基础数据库文件的直接访问。SQLITE_DBPAGE能够读取和写入数据库的任何页面。因为交互是通过寻呼机层进行的,所以所有更改都是事务性的。
警告:写入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扩展。
SQLITE_DBPAGE虚拟表读/写表,可以逐页直接访问基础磁盘文件。虚拟表似乎具有这样的架构:
创建表sqlite_dbpage( pgno整数主键, 数据BLOB );
SQLite数据库文件分为页面。第一页为1,第二页为2,依此类推。没有页面0。每页大小相同。每页的大小在512到65536之间为2的幂。有关详细信息,请参阅文件格式文档。
SQLITE_DBPAGE表允许应用程序查看或替换数据库文件每一页的原始二进制内容。不会尝试解释页面的内容。内容在磁盘上逐字节返回。
SQLITE_DBPAGE表在数据库文件中的每一页都有一行。SQLITE_DBPAGE允许读取或覆盖页面。但是,数据库文件的大小无法更改。无法通过对该表运行DELETE或INSERT操作来更改SQLITE_DBPAGE表中的行数。
上面显示的SQLITE_DBPAGE表架构不完整。第三个隐藏的列名为“ schema”,该列确定应读取或写入哪个 ATTACH版本的数据库。因为“ schema”列是隐藏的,所以当将SQLITE_DBPAGE作为表值函数调用时,可以将其用作参数。
例如,假设使用如下语句将一个附加数据库附加到数据库连接:
ATTACH'auxdata1.db'AS aux1;
然后,要读取该数据库文件的第一页,只需运行:
从sqlite_dbpage('aux1')中选择数据,其中pgno = 1;
如果省略“ schema”,则默认为主数据库(通常称为“ main”,除非使用SQLITE_DBCONFIG_MAINDBNAME重命名)。因此,以下两个查询通常是等效的:
从sqlite_dbpage('main')中选择数据,其中pgno = 1; 从sqlite_dbpage中选择数据,其中pgno = 1;
SQLITE_DBPAGE表可以像其他任何表一样参与联接。因此,要查看所有连接的数据库文件的第一页内容,可以运行如下语句:
选择dbpage.data,dblist.name FROM pragma_database_list AS dblist 加入sqlite_dbpage(dblist.name)AS dbpage 哪里dbpage.pgno = 1;