sqlite3:只读主数据库和ATTACH

时间:2011-01-09 05:06:35

标签: sqlite

我希望了解将ATTACH用于具有不同读写权限的数据库的含义。

我有一个场景,我需要访问驻留在只读文件系统中的大型数据库(大约512MB)。还有一个小的读写数据库,具有相同的模式,驻留在读写文件系统中。只读数据库提供了我的场景中使用的基本数据,并在读写数据库中存储了不常见的数据更新。

目前,我在单独的连接中打开这两个数据库,维护连接的代码负责向其客户端呈现数据的统一视图。例如,这意味着代码必须合并来自只读和读写数据库等的查询结果。我意识到这种设置不够优雅(并且可能是次优的)并且一直在寻求使用ATTACH命令来创建在SQL而不是C ++中统一查看数据。

我想知道是否有任何特定的陷阱与附加只读和读写数据库相关,我应该知道。我正在研究以下ATTACH场景之一:

  1. 将只读数据库打开为main,并将读写数据库ATTACH打开。这是我的首选解决方案。
  2. 打开读写数据库作为主数据并ATTACH读取只读数据库。
  3. 第三种选择?
  4. 一些谷歌查询指出了表示方案(1)中的问题的消息。因为我没有找到确定的答案,并且因为我自己使用sqlite 3.6.13的测试没有发现任何问题,所以我发布了这个问题。

    感谢您的任何见解。

1 个答案:

答案 0 :(得分:3)

documentation似乎没有提及将读写数据库附加到只读数据库的任何警告。

所以我的假设是,您应该发生的事情是,当您打开一个并附加另一个数据库时,也应该单独打开数据库。

我将您的方案1置于测试中,似乎工作正常。这是我试过的:

[someone@somewhere tmp]$ echo .dump | sqlite3 big_readonly_db
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE foo (a INT);
INSERT INTO "foo" VALUES(1);
INSERT INTO "foo" VALUES(2);
INSERT INTO "foo" VALUES(3);
INSERT INTO "foo" VALUES(4);
INSERT INTO "foo" VALUES(5);
COMMIT;
[someone@somewhere tmp]$ echo .dump | sqlite3 small_readwrite_db
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE bar (a INT);
COMMIT;
[someone@somewhere tmp]$ chmod -w big_readonly_db
[someone@somewhere tmp]$ ls -l big_readonly_db
-r--r--r-- 1 someone someone 2048 Apr 12 21:41 big_readonly_db
[someone@somewhere tmp]$ sqlite3 big_readonly_db
SQLite version 3.7.7.1 2011-06-28 17:39:05
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> attach database small_readwrite_db as rw;
sqlite> insert into bar select * from foo;
sqlite> select * from bar;
1
2
3
4
5