sqlite3: основная база данных только для чтения и ATTACH - PullRequest
6 голосов
/ 09 января 2011

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

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

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

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

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

Несколько Googleзапросы указывали на сообщения, указывающие на проблемы в сценарии (1).Поскольку я не нашел однозначного ответа и поскольку мое собственное тестирование с использованием sqlite 3.6.13 не выявило никаких проблем, я отправляю этот вопрос.

Спасибо за любые идеи.

1 Ответ

3 голосов
/ 12 апреля 2012

Документация , по-видимому, не упоминает никаких предупреждений о присоединении баз данных для чтения и записи к базам данных только для чтения.

Поэтому я предполагаю, что то, что вы должны ожидать, если базы данных будут открываться отдельно, должно происходить и при открытии одной и присоединении другой.

Я проверил ваш сценарий 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...