无法查询位于只读目录

时间:2016-12-30 13:09:48

标签: java sqlite jdbc

我有一个包含以下文件的目录:

contacts.sqlite
forms.sqlite
locations.sqlite
locations.sqlite-shm
locations.sqlite-wal

我在此目录中只有以下NTFS权限:

  • 阅读&执行
  • 列出文件夹内容

当我尝试使用Java JDBC查询这些文件时,我会遇到不同的行为:

  • contacts.sqlite :异常 - [SQLITE_CANTOPEN]无法打开数据库文件(无法打开数据库文件)
  • forms.sqlite :我可以成功查询数据。
  • locations.sqlite :尝试打开新的共享内存段时出现 - [SQLITE_IOERR_SHMOPEN] xShmMap中的I / O错误(磁盘I / O错误)

以下是一些注释:

  • 每个文件只有一个数据库连接。
  • 正在使用这些文件的应用程序已关闭/崩溃。
  • 我无法删除或更改原始目录中的文件
  • 我无法更改目录权限。
  • 我只需要查询数据,无需插入任何数据。
  • 我尝试使用" DB Browser for SQLite"打开这些文件。我只能打开" forms.sqlite"与Java JDBC的情况相同。

我尝试了以下内容:

  • 将文件复制到具有读/写权限的目录,我可以查询所有文件。
  • 将journal_mode设置为OFF:没有帮助
  • 将temp_store设置为内存:没有帮助
  • 以只读方式打开数据库:没有帮助

编辑: 我正在使用Xerial SQLite JDBC驱动程序。我尝试以只读方式打开并设置其他paragma如下:

SQLiteConfig  config = new SQLiteConfig();
config.setPragma(Pragma.JOURNAL_MODE, "OFF");
//config.setOpenMode(SQLiteOpenMode.READONLY);
config.setReadOnly(true);
DriverManager.getConnection("data_base_url",
                    config.toProperties());

我的问题:有没有办法在这些文件位于原始目录中时查询这些文件而不更改其权限?

2 个答案:

答案 0 :(得分:0)

documentation中所述,必须使用写访问权限打开WAL模式下的数据库。

您必须更改为回滚日志模式,或使用可写目录。

答案 1 :(得分:0)

我有类似的问题,我在尝试以ReadOnly模式打开SQLite DB时出现了“无法打开数据库文件”,该模式存储在具有“读取,读取执行”权限的文件夹中。 解决方案很简单,原来该文件里面有“文件格式写入版本”(偏移量:0x12)和“文件格式读取版本”(偏移量:0x13)字段。 在两者中我都有值“0x02”,这意味着WAL(见file format)。如果您希望能够访问只读目录中的DB,则需要有0x01(Legacy)。

<强>解决方案: 将DB文件复制到某个ReadWrite文件夹,并使用任何十六进制编辑器更新DB文件。并且确保在将来连接到DB时不能使用WAL JournalMode。 如果您有* .sqlite-shm和* .sqlite-wal - 这些文件必须在所有客户端与DB断开连接后消失,因此似乎在活动连接时复制了DB文件。