2011-01-09 3 views
6

Я хочу понять последствия использования ATTACH для баз данных с различными разрешениями на чтение и запись.sqlite3: основная база данных только для чтения и ATTACH

У меня есть сценарий, когда мне нужно получить доступ к большой базе данных (около 512 МБ), которая находится в файловой системе только для чтения. Существует также небольшая база данных для чтения и записи с той же схемой, которая находится в файловой системе чтения-записи. База данных, доступная только для чтения, предоставляет базовые данные, используемые в моем сценарии, с нечастыми обновлениями данных, хранящимися в базе данных для чтения и записи.

В настоящее время я открываю эти две базы данных в отдельных соединениях, а код, поддерживающий соединения, отвечает за представление единого представления данных своим клиентам. Например, это означает, что код должен объединять результаты запроса из баз данных только для чтения и чтения-записи и т. Д. Я понимаю, что эта настройка является неэлементарной (и, вероятно, субоптимальной), и пыталась использовать команду ATTACH для создания унифицированный вид данных в SQL, а не на C++.

Мне интересно, есть ли какие-либо особенности, связанные с прикреплением баз данных только для чтения и чтения-записи, о которых я должен знать. Я рассматриваю один из следующих сценариев ATTACH:

  1. Откройте базу данных только для чтения как основную и ATTACH базу данных для чтения и записи. Это мое предпочтительное решение.
  2. Откройте базу данных чтения и записи в качестве основной и ATTACH базу данных только для чтения.
  3. Третий вариант?

Несколько запросов google указывают на сообщения, предлагающие проблемы в сценарии (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

Смежные вопросы