2011-01-09 54 views
6

我在尋找理解使用ATTACH與具有不同讀寫權限的數據庫的含義。sqlite3:只讀主數據庫和附件

我有一個場景,我需要訪問駐留在只讀文件系統中的大型數據庫(大約512MB)。還有一個小型的讀寫數據庫,具有相同的模式,駐留在讀寫文件系統中。只讀數據庫提供在我的方案中使用的基本數據,並且不常讀取數據更新存儲在讀寫數據庫中。

當前我在單獨的連接中打開這兩個數據庫,維護連接的代碼負責向客戶端呈現數據的統一視圖。例如,這意味着代碼必須合併來自只讀和讀寫數據庫的查詢結果等等。我意識到這種設置不夠優雅(並且可能不是最佳的),並且一直在尋找使用ATTACH命令來創建SQL中數據的統一視圖而不是C++。

我想知道是否有任何特定的問題涉及附加只讀和讀寫數據庫,我應該知道。我正在查看以下ATTACH場景之一:

  1. 以只讀數據庫爲主打開並附加讀寫數據庫。這是我首選的解決方案。
  2. 打開讀寫數據庫爲主,並附加只讀數據庫。
  3. 第三個選擇?

有幾個谷歌查詢指出消息提示方案(1)中存在問題。因爲我沒有找到明確的答案,並且因爲我自己使用sqlite 3.6.13進行的測試沒有發現任何問題,所以我發佈了這個問題。

謝謝你的任何見解。

回答

3

documentation似乎沒有提及將讀寫數據庫附加到只讀數據庫的任何警告。

所以我的假設是,你應該期望發生的事情是,當你打開一個並附加另一個數據庫時,另外打開的數據庫也應該發生。

我把你的方案1進行測試,它似乎工作正常。這是我試過的:

[[email protected] 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; 
[[email protected] tmp]$ echo .dump | sqlite3 small_readwrite_db 
PRAGMA foreign_keys=OFF; 
BEGIN TRANSACTION; 
CREATE TABLE bar (a INT); 
COMMIT; 
[[email protected] tmp]$ chmod -w big_readonly_db 
[[email protected] tmp]$ ls -l big_readonly_db 
-r--r--r-- 1 someone someone 2048 Apr 12 21:41 big_readonly_db 
[[email protected] 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 
+1

如果主數據庫是用`SQLITE_OPEN_READONLY`標誌打開的話,這不起作用。 – ybungalobill 2016-06-03 07:47:36