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

我有一种情况,我需要访问驻留在只读文件系统中的大型数据库(大约512MB)。还有一个小型读写数据库,该数据库具有与读写文件系统中相同的架构。只读数据库提供了我的方案中使用的基础数据,并且不频繁的数据更新存储在读写数据库中。

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

我想知道那时是否存在与附加只读和读写数据库有关的特定陷阱,我应该注意这些陷阱。我正在研究以下ATTACH方案之一:

  • 打开只读数据库作为main,并附加读写数据库。这是我的首选解决方案。
  • 以主身份打开读写数据库,并附加只读数据库。
  • 第三种选择?

  • 一些Google查询指出了提示情况(1)中问题的消息。因为我没有找到明确的答案,并且因为我使用sqlite 3.6.13进行的测试没有发现任何问题,所以我发布了这个问题。

    感谢您的任何见解。

    最佳答案

    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
    

    关于sqlite - sqlite3 : read-only main database and ATTACH,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4637790/

    10-12 02:32