2011-01-09 21 views
6

Estoy tratando de comprender las implicaciones de utilizar ATTACH con bases de datos con permisos de lectura y escritura diferentes.sqlite3: base de datos principal de solo lectura y ATTACH

Tengo una situación en la que necesito acceder a una gran base de datos (aproximadamente 512MB) que reside en un sistema de archivos de solo lectura. También hay una pequeña base de datos de lectura y escritura con el mismo esquema que reside en un sistema de archivos de lectura y escritura. La base de datos de solo lectura proporciona los datos base utilizados en mi escenario, con actualizaciones de datos poco frecuentes almacenadas en la base de datos de lectura y escritura.

Actualmente abro estas dos bases de datos en conexiones separadas y el código que mantiene las conexiones es responsable de presentar una vista unificada de los datos a sus clientes. Por ejemplo, esto significa que el código tiene que fusionar los resultados de las consultas de las bases de datos de solo lectura y lectura-escritura, etc. Me doy cuenta de que esta configuración es poco elegante (y probablemente no sea óptima) y he estado buscando utilizar el comando ATTACH para crear un vista unificada de los datos en SQL en lugar de C++.

Me pregunto si hay algún problema en particular relacionado con adjuntar bases de datos de solo lectura y lectura y escritura de las que deba tener conocimiento. Estoy viendo uno de los siguientes escenarios de ATTACH:

  1. Abra la base de datos de solo lectura como principal y ADJUNTE la base de datos de lectura y escritura. Esta es mi solución preferida.
  2. Abra la base de datos de lectura y escritura como principal y FIJE la base de datos de solo lectura.
  3. ¿Una tercera alternativa?

Algunas consultas de Google apuntan a mensajes que sugieren problemas en el escenario (1). Debido a que no encontré una respuesta definitiva y porque mi propia prueba con sqlite 3.6.13 no reveló ningún problema, estoy publicando esta pregunta.

Gracias por cualquier idea.

Respuesta

3

El documentation no parece mencionar ninguna advertencia al asociar las bases de datos de lectura y escritura a las de solo lectura.

Así que mi suposición es que lo que debe esperar es que las bases de datos que se abrirán por separado también sucedan cuando abra una y adjunte la otra.

Puse el escenario 1 a prueba y parece funcionar bien. Esto es lo que probé:

[[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

Esto no funciona si la base de datos principal se abre con el indicador 'SQLITE_OPEN_READONLY'. – ybungalobill

Cuestiones relacionadas