2010-07-26 54 views

Respuesta

173

SQLite ha tenido que sacrificar otras características que algunas personas encuentran útiles, tales como alta concurrencia, de grano fino control de acceso, un rico conjunto de funciones incorporadas, procedimientos almacenados, las características del lenguaje SQL esotéricos , XML y/o extensiones de Java, o tera- peta bytes escalabilidad, y así sucesivamente

Fuente: Appropriate Uses For SQLite

+1

Puede usar el equivalente SQLite de las funciones SQL CLR para lograr el mismo objetivo (http://stackoverflow.com/questions/172735/create-use-user-defined-functions-in-system-data-sqlite). – devinbost

+0

@bostIT Gracias por la adición. Ref para System.Data.SQLite http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki – h3xStream

20
+2

Este enlace está muerto ahora –

+1

Si bien este enlace puede responder a la pregunta, es mejor para incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. - [De la crítica] (/ review/low-quality-posts/19047098) –

14

Si todavía está interesado, Chris Wolf realizó una implementación prototipo de SQLite con procedimientos almacenados. Puede encontrar los detalles en su blog: Adding Stored Procedures to SQLite

+2

El artículo está muerto ahora, pero el proyecto está en https://github.com/wolfch/sqlite-3.7.3.p1. El archivo Léame implica que esto no está listo para producción, ni tampoco es para experimentación.Parece que es más una prueba de concepto. – pqsk

72

respuesta: NO

He aquí por qué ... Creo que una razón clave para tener procedimientos almacenados en una base de datos es que eres ejecutando código SP en el mismo proceso que el motor SQL. Esto tiene sentido para los motores de bases de datos diseñados para funcionar como un servicio conectado a la red, pero el imperativo para SQLite es mucho menor dado que se ejecuta como una DLL en su proceso de aplicación en lugar de en un proceso separado de motor SQL. Por lo tanto, tiene más sentido implementar toda la lógica de su negocio, incluido lo que hubiera sido el código SP en el idioma del host.

Sin embargo, puede extender SQLite con su propio user defined functions en el idioma del host (PHP, Python, Perl, C#, Javascript, Ruby, etc.). A continuación, puede usar estas funciones personalizadas como parte de cualquier SQLite select/update/insert/delete. Tengo done this in C# usando DevArt's SQLite para implementar hashing de contraseña.

+14

Para aclarar ... No estoy diciendo que NO haya ningún motivo para implementar SP en SQLite, sino mucho menos que en otros motores de DB. –

+3

La razón principal para tener procedimientos almacenados es prevenir contra la inyección de SQL. Sin embargo, hay muchas otras razones. Por ejemplo, poder compartir las consultas relevantes incrustándolas en el archivo sqlite. No hay absolutamente ninguna diferencia entre una consulta estándar que se ejecuta en el contexto de SQL Engine y la selección de un SP. Ambos funcionan en SQL ENGINE. – Dan

+2

@Dan En primer lugar, los SP existían mucho antes de que se pensara siquiera en la inyección de SQL. Se han creado miles de aplicaciones basadas en SQL sin ellas, que son seguras contra este ataque. También revisé el código de los SP inseguros que son vulnerables a la inyección de SQL (generalmente basados ​​en SQL dinámico). Entonces no, no, esta es una razón principal. Hay muchas otras maneras de evitar este ataque en la parte superior de la pila. –

2

El hecho de que la mayoría de las aplicaciones que usan SQLite no usan procesos almacenados no significa que no sean útiles.

Uno de los usos principales que tengo para ellos es que no tengo que volver a distribuir una aplicación completa cuando una consulta cambia ligeramente. Solo el DB cambia, y ese es un script simple, generalmente menos de 1k.

Estoy considerando si debo publicar mi código almacenado Proc C#/SQL. Encontré este hilo cuando estaba buscando para ver si alguien más lo había hecho.

No estoy en desacuerdo con la idea de que las personas (a veces) quieran que sproc se ejecute en el mismo espacio de ejecución que el servidor, pero SQLite está, por definición, en el mismo espacio que la aplicación.

Cuestiones relacionadas