¿Cuáles son las ventajas y desventajas de mantener SQL en procesos almacenados versus código [cerrado]

StackOverflow https://stackoverflow.com/questions/15142

Pregunta

¿Cuáles son las ventajas/desventajas de mantener SQL en su código fuente C# o en Stored Procs?He estado discutiendo esto con un amigo en un proyecto de código abierto en el que estamos trabajando (Foro C# ASP.NET).Por el momento, la mayor parte del acceso a la base de datos se realiza construyendo SQL en línea en C# y llamando a la base de datos de SQL Server.Así que estoy tratando de establecer cuál sería mejor para este proyecto en particular.

Hasta ahora tengo:

Ventajas de in Code:

  • Más fácil de mantener: no es necesario ejecutar un script SQL para actualizar las consultas
  • Más fácil de portar a otra base de datos: no hay procesos para portar

Ventajas de los procesos almacenados:

  • Actuación
  • Seguridad
¿Fue útil?

Solución

No soy fanático de los procedimientos almacenados.

Los procedimientos almacenados son MÁS mantenibles porque:* No es necesario que vuelvas a compilar tu aplicación C# cada vez que quieras cambiar algo de SQL.

Terminarás recompilándolo de todos modos cuando los tipos de datos cambien, o quieras devolver una columna adicional, o lo que sea.La cantidad de veces que puedes cambiar 'transparentemente' el SQL desde debajo de tu aplicación es bastante pequeña en general

  • Terminas reutilizando el código SQL.

Los lenguajes de programación, incluido C#, tienen algo sorprendente llamado función.¡Significa que puedes invocar el mismo bloque de código desde múltiples lugares!¡Asombroso!Luego puede colocar el código SQL reutilizable dentro de uno de estos, o si desea obtener tecnología realmente avanzada, puede usar una biblioteca que lo haga por usted.Creo que se llaman Mapeadores relacionales de objetos y son bastante comunes hoy en día.

¡La repetición de código es lo peor que puedes hacer cuando intentas crear una aplicación mantenible!

De acuerdo, por eso los procesos almacenados son algo malo.Es mucho más fácil refactorizar y descomponer (dividir en partes más pequeñas) el código en funciones que SQL en...bloques de SQL?

Tienes 4 servidores web y un montón de aplicaciones de Windows que usan el mismo código SQL. Ahora te diste cuenta de que hay un pequeño problema con el código SQL, ¿prefieres...?cambie el proceso en 1 lugar o envíe el código a todos los servidores web, reinstale todas las aplicaciones de escritorio (hacer clic una vez podría ayudar) en todos los cuadros de Windows

¿Por qué sus aplicaciones de Windows se conectan directamente a una base de datos central?Eso parece un ENORME agujero de seguridad y un cuello de botella, ya que descarta el almacenamiento en caché del lado del servidor.¿No deberían conectarse a través de un servicio web o similar a sus servidores web?

Entonces, ¿impulsar 1 nuevo sproc o 4 nuevos servidores web?

En este caso es Es más fácil impulsar un nuevo sproc, pero en mi experiencia, el 95% de los "cambios impulsados" afectan el código y no la base de datos.Si envía 20 cosas a los servidores web ese mes y 1 a la base de datos, difícilmente perderá mucho si, en cambio, envía 21 cosas a los servidores web y cero a la base de datos.

Código más fácilmente revisado.

¿Puedes explicar cómo?No entiendo esto.En particular, dado que los sprocs probablemente no estén en control de fuente y, por lo tanto, no se pueda acceder a ellos a través de navegadores SCM basados ​​en web, etc.

Más desventajas:

Los Storedprocs viven en la base de datos, que aparece al mundo exterior como una caja negra.Cosas simples como querer ponerlos en control de fuente se convierten en una pesadilla.

También está la cuestión del puro esfuerzo.Podría tener sentido dividir todo en un millones de niveles si está tratando de justificarle a su CEO por qué les costó 7 millones de dólares crear algunos foros, pero por lo demás, crear un proceso almacenado para cada pequeña cosa es solo un trabajo extra sin ningún beneficio.

Otros consejos

Esto se está discutiendo en algunos otros hilos aquí actualmente.Soy un defensor constante de los procedimientos almacenados, aunque se están presentando algunos buenos argumentos a favor de Linq to Sql.

Incrustar consultas en su código lo vincula estrechamente con su modelo de datos.Los procedimientos almacenados son una buena forma de programación contractual, lo que significa que un DBA tiene la libertad de alterar el modelo de datos y el código en el procedimiento, siempre que se mantenga el contrato representado por las entradas y salidas del procedimiento almacenado.

Ajustar las bases de datos de producción puede resultar extremadamente difícil cuando las consultas están ocultas en el código y no en una ubicación central fácil de administrar.

[Editar] Aquí hay otro discusión actual

En mi opinión no se puede votar sí o no en esta pregunta.Depende totalmente del diseño de su aplicación.

Voto totalmente en contra del uso de SP en un entorno de 3 niveles, donde tienes un servidor de aplicaciones al frente.En este tipo de entorno, su servidor de aplicaciones está ahí para ejecutar su lógica empresarial.Si además utiliza SP, comenzará a distribuir su implementación de lógica de negocios en todo su sistema y quedará muy confuso quién es responsable de qué.Con el tiempo, terminará con un servidor de aplicaciones que básicamente no hará nada más que lo siguiente:

(Pseudocode)

Function createOrder(Order yourOrder) 
Begin
  Call SP_createOrder(yourOrder)
End

Entonces, al final, tendrá su nivel medio ejecutándose en este fantástico clúster de 4 servidores, cada uno de ellos equipado con 16 CPU, ¡y en realidad no hará nada en absoluto!¡Que desperdicio!

Si tiene un cliente GUI pesado que se conecta directamente a su base de datos o tal vez incluso a más aplicaciones, es una historia diferente.En esta situación, los SP pueden servir como una especie de pseudo nivel medio que desacopla su aplicación del modelo de datos y ofrece un acceso controlable.

Ventajas de in Code:

  • Más fácil de mantener: no es necesario ejecutar un script SQL para actualizar las consultas
  • Más fácil de portar a otra base de datos: no hay procesos para portar

En realidad, creo que lo tienes al revés.En mi humilde opinión, SQL en el código es complicado de mantener porque:

  • terminas repitiéndote en bloques de código relacionados
  • SQL no es compatible como lenguaje en muchos IDE, por lo que solo tiene una serie de cadenas verificadas sin errores que realizan tareas por usted.
  • Los cambios en un tipo de datos, nombre de tabla o restricción son mucho más frecuentes que cambiar una base de datos completa por una nueva.
  • su nivel de dificultad aumenta a medida que su consulta crece en complejidad
  • y probar una consulta en línea requiere construir el proyecto

Piense en los Stored Procs como métodos que llama desde el objeto de la base de datos: son mucho más fáciles de reutilizar, solo hay un lugar para editar y, en caso de que cambie los proveedores de base de datos, los cambios ocurren en sus Stored Procs y no en su código. .

Dicho esto, las ganancias de rendimiento de los procesos almacenados son mínimas, como dijo Stu antes que yo y no se puede poner un punto de interrupción en un procedimiento almacenado (todavía).

ESTAFA

Encuentro que realizar una gran cantidad de procesamiento dentro de los procedimientos almacenados haría que su servidor de base de datos sea un único punto de inflexibilidad, cuando se trata de escalar su acto.

Sin embargo, al hacer todo ese procesamiento en su programa en lugar del servidor SQL, podría le permitirá escalar más si tiene varios servidores que ejecutan su código.Por supuesto, esto no se aplica a los procesos almacenados que solo realizan la búsqueda o actualización normal, sino a aquellos que realizan más procesamiento, como recorrer conjuntos de datos.

PROS

  1. Rendimiento por lo que puede valer (evita el análisis de consultas por parte del controlador de base de datos/recreación del plan, etc.)
  2. La manipulación de datos no está integrada en el código C/C++/C#, lo que significa que tengo menos código de bajo nivel para revisar.SQL es menos detallado y más fácil de revisar cuando se enumera por separado.
  3. Debido a la separación, la gente puede encontrar y reutilizar el código SQL mucho más fácilmente.
  4. Es más fácil cambiar las cosas cuando cambia el esquema: solo tienes que darle el mismo resultado al código y funcionará bien.
  5. Más fácil de portar a una base de datos diferente.
  6. Puedo enumerar permisos individuales en mis procedimientos almacenados y controlar el acceso a ese nivel también.
  7. Puedo perfilar mi código de persistencia/consulta de datos por separado de mi código de transformación de datos.
  8. Puedo implementar condiciones modificables en mi procedimiento almacenado y sería fácil de personalizar en el sitio del cliente.
  9. Se vuelve más fácil usar algunas herramientas automatizadas para convertir mi esquema y mis declaraciones juntas en lugar de cuando están incrustadas dentro de mi código, donde tendría que buscarlas.
  10. Garantizar las mejores prácticas para el acceso a los datos es más fácil cuando tiene todo el código de acceso a los datos dentro de un solo archivo: puedo verificar las consultas que acceden a la tabla que no funciona o que usa un nivel más alto de serialización o seleccionar * en el código, etc. .
  11. Es más fácil encontrar cambios en el esquema/cambios en la lógica de manipulación de datos cuando todo está listado en un solo archivo.
  12. Es más fácil buscar y reemplazar ediciones en SQL cuando están en el mismo lugar, p.cambiar/agregar declaraciones de aislamiento de transacciones para todos los procesos almacenados.
  13. El DBA y yo descubrimos que tener un archivo SQL separado es más fácil y conveniente cuando el DBA tiene que revisar mi material SQL.
  14. Por último, no tiene que preocuparse por los ataques de inyección de SQL porque algún miembro perezoso de su equipo no utilizó consultas parametrizadas cuando utilizó SQL integrado.

La ventaja de rendimiento de los procedimientos almacenados suele ser insignificante.

Más ventajas para los procedimientos almacenados:

  • Evite la ingeniería inversa (si se creó con cifrado, por supuesto)
  • Mejor centralización del acceso a la base de datos
  • Capacidad para cambiar el modelo de datos de forma transparente (sin tener que implementar nuevos clientes);especialmente útil si varios programas acceden al mismo modelo de datos

caigo sobre el código lado.Creamos una capa de acceso a datos que utilizan todas las aplicaciones (tanto web como cliente), por lo que es SECO desde esa perspectiva.Simplifica la implementación de la base de datos porque solo tenemos que asegurarnos de que los esquemas de la tabla sean correctos.Simplifica el mantenimiento del código porque no tenemos que mirar el código fuente ni la base de datos.

No tengo muchos problemas con el estrecho acoplamiento con el modelo de datos porque no veo dónde es posible realmente romper ese acoplamiento.Una aplicación y sus datos están inherentemente acoplados.

Procedimientos almacenados.

Si se produce un error o la lógica cambia un poco, no es necesario volver a compilar el proyecto.Además, permite el acceso desde diferentes fuentes, no solo desde el lugar donde codificó la consulta en su proyecto.

No creo que sea más difícil mantener los procedimientos almacenados; no debe codificarlos directamente en la base de datos, sino primero en archivos separados, luego puede ejecutarlos en cualquier base de datos que necesite configurar.

Ventajas de los procedimientos almacenados:

Código más fácilmente revisado.

Menos acoplados, por lo tanto, más fáciles de probar.

Sintonizado más fácilmente.

El rendimiento es generalmente mejor, desde el punto de vista del tráfico de red: si tiene un cursor o algo similar, entonces no hay múltiples viajes a la base de datos.

Puede proteger el acceso a los datos más fácilmente, eliminar el acceso directo a las tablas, imponer la seguridad a través de los procesos; esto también le permite encontrar relativamente rápido cualquier código que actualice una tabla.

Si hay otros servicios involucrados (como los servicios de informes), puede que le resulte más fácil almacenar toda la lógica en un procedimiento almacenado, en lugar de en código, y tener que duplicarlo.

Desventajas:

Más difícil de gestionar para los desarrolladores:control de versiones de los scripts:¿Todos tienen su propia base de datos? ¿El sistema de control de versiones está integrado con la base de datos y el IDE?

En algunas circunstancias, el código SQL creado dinámicamente puede tener un mejor rendimiento que un proceso almacenado.Si ha creado un proceso almacenado (digamos sp_customersearch) que se vuelve extremadamente complicado con docenas de parámetros porque debe ser muy flexible, probablemente pueda generar una declaración SQL mucho más simple en el código en tiempo de ejecución.

Se podría argumentar que esto simplemente mueve parte del procesamiento de SQL al servidor web, pero en general eso sería algo bueno.

La otra gran ventaja de esta técnica es que si busca en el generador de perfiles SQL, puede ver la consulta que generó y depurarla mucho más fácilmente que ver una llamada de proceso almacenada con 20 parámetros.

Me gustan los procesos almacenados, no sé cuántas veces pude realizar un cambio en una aplicación utilizando un procedimiento almacenado que no produjo ningún tiempo de inactividad en la aplicación.

Gran admirador de Transact SQL, el ajuste de consultas grandes ha demostrado ser muy útil para mí.¡No he escrito ningún SQL en línea en aproximadamente 6 años!

Enumeras 2 puntos profesionales para sprocs:

Rendimiento, en realidad no.En Sql 2000 o superior, las optimizaciones del plan de consultas son bastante buenas y están almacenadas en caché.Estoy seguro de que Oracle, etc. hace cosas similares.No creo que ya haya motivos para sprocs para el rendimiento.

¿Seguridad?¿Por qué los sprocs serían más seguros?A menos que tenga una base de datos bastante insegura, todo el acceso será desde su administrador de bases de datos o a través de su aplicación.Siempre parametrice todas las consultas; nunca incluya algo a partir de la entrada del usuario y estará bien.

De todos modos, esa es la mejor práctica para el rendimiento.

Linq es definitivamente el camino que seguiría en un nuevo proyecto en este momento.Mira esto publicación similar.

@Keith

¿Seguridad?¿Por qué los sprocs serían más seguros?

Según lo sugerido por Komradekatz, puede no permitir el acceso a las tablas (para la combinación de nombre de usuario/contraseña que se conecta a la base de datos) y permitir el acceso al SP únicamente.De esa manera, si alguien obtiene el nombre de usuario y la contraseña de su base de datos, podrá ejecutar los SP pero no podrá acceder a las tablas ni a ninguna otra parte de la base de datos.

(Por supuesto, la ejecución de sprocs puede brindarles todos los datos que necesitan, pero eso dependería de los sprocs que estuvieran disponibles.Darles acceso a las tablas les da acceso a todo).

Piénsalo de esta manera

Tiene 4 servidores web y un montón de aplicaciones de Windows que usan el mismo código SQL ahora que se dio cuenta de que hay un pequeño problema con el código SQL, así que prefiere ...Cambie el proceso en 1 lugar o presione el código a todos los servidores web, reinstale todas las aplicaciones de escritorio (ClickOnce podría ayudar) en todas las cuadros de Windows

Prefiero procesos almacenados

También es más fácil realizar pruebas de rendimiento contra un proceso, colóquelo en el analizador de consultas Estadísticas de establecimiento IO/TIEMPA en set showplan_text on and voila

no es necesario ejecutar el generador de perfiles para ver exactamente cómo se llama

solo mis 2 centavos

Prefiero mantenerlos en código (usando un ORM, no en línea o ad-hoc) para que estén cubiertos por el control de fuente sin tener que lidiar con guardar archivos .sql.

Además, los procedimientos almacenados no son inherentemente más seguros.Puede escribir una consulta incorrecta con un sproc tan fácilmente como en línea.Las consultas en línea parametrizadas pueden ser tan seguras como un sproc.

Utilice el código de su aplicación como lo que mejor hace:manejar la lógica.
Utilice su base de datos para lo que hace mejor:Almacenamiento de datos.

Puede depurar procedimientos almacenados, pero le resultará más fácil depurar y mantener la lógica en el código.Por lo general, terminará de recompilar su código cada vez que cambie el modelo de base de datos.

Además, los procedimientos almacenados con parámetros de búsqueda opcionales son muy ineficientes porque hay que especificar de antemano todos los parámetros posibles y las búsquedas complejas a veces no son posibles porque no se puede predecir cuántas veces se repetirá un parámetro en la búsqueda.

Cuando se trata de seguridad, los procedimientos almacenados son mucho más seguros.Algunos han argumentado que, de todos modos, todo el acceso se realizará a través de la aplicación.Lo que mucha gente olvida es que la mayoría de las violaciones de seguridad provienen del interior de una empresa.Piense en cuántos desarrolladores conocen el nombre de usuario y la contraseña "ocultos" de su aplicación.

Además, como señaló MatthieuF, el rendimiento se puede mejorar mucho debido a menos viajes de ida y vuelta entre la aplicación (ya sea en un escritorio o en un servidor web) y el servidor de la base de datos.

En mi experiencia, la abstracción del modelo de datos a través de procedimientos almacenados también mejora enormemente la mantenibilidad.Como alguien que ha tenido que mantener muchas bases de datos en el pasado, es un gran alivio cuando se enfrenta a un cambio de modelo requerido poder simplemente cambiar uno o dos procedimientos almacenados y hacer que el cambio sea completamente transparente para TODAS las aplicaciones externas.Muchas veces su aplicación no es la única que apunta a una base de datos: existen otras aplicaciones, soluciones de informes, etc.por lo que rastrear todos esos puntos afectados puede ser una molestia con el acceso abierto a las mesas.

También pondré marcas en la columna más para poner la programación SQL en manos de aquellos que se especializan en ella, y para que los SP hagan que sea mucho más fácil aislar y probar/optimizar el código.

La única desventaja que veo es que muchos lenguajes no permiten pasar parámetros de tabla, por lo que pasar un número desconocido de valores de datos puede ser molesto, y algunos lenguajes aún no pueden manejar la recuperación de múltiples conjuntos de resultados de un solo procedimiento almacenado (aunque el último no hace que los SP sean peores que SQL en línea en ese sentido).

Una de las sugerencias de una sesión de Microsoft TechEd sobre seguridad a la que asistí fue realizar todas las llamadas a través de procesos almacenados y denegar el acceso directamente a las tablas.Se consideró que este enfoque proporcionaba seguridad adicional.No estoy seguro de si vale la pena solo por seguridad, pero si ya estás usando procesos almacenados, no estaría de más.

Definitivamente más fácil de mantener si lo colocas en un procedimiento almacenado.Si hay una lógica difícil involucrada que potencialmente cambiará en el futuro, definitivamente es una buena idea ponerla en la base de datos cuando tenga varios clientes conectados.Por ejemplo, ahora mismo estoy trabajando en una aplicación que tiene una interfaz web de usuario final y una aplicación de escritorio administrativa, las cuales comparten una base de datos (obviamente) y estoy tratando de mantener la mayor cantidad de lógica posible en la base de datos.Este es un ejemplo perfecto de la Principio SECO.

Estoy firmemente del lado de los procesos almacenados, suponiendo que no hagas trampa y uses SQL dinámico en el proceso almacenado.Primero, el uso de procesos almacenados permite al administrador de bases de datos establecer permisos en el nivel de proceso almacenado y no en el nivel de tabla.Esto es fundamental no sólo para combatir los ataques de inyección SQL sino también para evitar que personas internas accedan directamente a la base de datos y cambien cosas.Esta es una manera de ayudar a prevenir el fraude.Nunca se debe acceder a ninguna base de datos que contenga información personal (SSN, números de tarjetas de crédito, etc.) o que de alguna manera cree transacciones financieras, excepto a través de procedimientos establecidos.Si utiliza cualquier otro método, dejará su base de datos abierta para que personas de la empresa creen transacciones financieras falsas o roben datos que pueden usarse para el robo de identidad.

Los procesos almacenados también son mucho más fáciles de mantener y ajustar el rendimiento que el SQL enviado desde la aplicación.También permiten al administrador de bases de datos una forma de ver cuál será el impacto de un cambio estructural de la base de datos en la forma en que se accede a los datos.Nunca he conocido a un buen administrador de bases de datos que permita el acceso dinámico a la base de datos.

Usamos procedimientos almacenados con Oracle DB donde trabajo ahora.También utilizamos Subversion.Todos los procedimientos almacenados se crean como archivos .pkb y .pks y se guardan en Subversion.¡He hecho SQL en línea antes y es una molestia!Prefiero la forma en que lo hacemos aquí.Crear y probar nuevos procedimientos almacenados es mucho más fácil que hacerlo en su código.

Hay una

Troncos más pequeños

Otra pequeña ventaja de los procedimientos almacenados que no se ha mencionado:cuando se trata de tráfico SQL, el acceso a datos basado en sp genera mucho menos tráfico.Esto se vuelve importante cuando monitorea el tráfico para realizar análisis y elaboración de perfiles: los registros serán mucho más pequeños y legibles.

No soy un gran admirador de los procedimientos almacenados, pero los uso con una condición:

Cuando la consulta es bastante grande, es mejor almacenarla en la base de datos como un procedimiento almacenado en lugar de enviarla desde el código.De esa manera, en lugar de enviar grandes cantidades de caracteres de cadena desde el servidor de aplicaciones a la base de datos, sólo el "EXEC SPNAME" Se enviará el comando.

Esto es excesivo cuando el servidor de la base de datos y el servidor web no están en la misma red (por ejemplo, comunicación por Internet).E incluso si ese no fuera el caso, demasiado estrés significa mucho ancho de banda desperdiciado.

Pero hombre, son tan terribles de manejar.Los evito tanto como puedo.

Un proceso almacenado de SQL no aumenta el rendimiento de la consulta

Bueno, obviamente, usar procedimientos almacenados tiene varias ventajas sobre la construcción de SQL en código.

  1. La implementación de su código y SQL se vuelven independientes entre sí.
  2. El código es más fácil de leer.
  3. Escribe una vez y úsala muchas veces.
  4. Modificar una vez
  5. No es necesario dar detalles internos al programador sobre la base de datos.etcétera etcétera.

Los procedimientos almacenados son MÁS mantenible porque:

  • No es necesario que vuelvas a compilar tu aplicación C# cada vez que quieras cambiar algo de SQL.
  • Terminas reutilizando el código SQL.

La repetición de código es la el peor ¡Lo que puedes hacer cuando intentas crear una aplicación mantenible!

¿Qué sucede cuando encuentra un error lógico que debe corregirse en varios lugares?Es más probable que te olvides de cambiar el último lugar donde copiaste y pegaste tu código.

En mi opinión, las mejoras en rendimiento y seguridad son una ventaja adicional. Aún puede escribir procedimientos almacenados SQL inseguros/ineficientes.

Más fácil de portar a otra base de datos: no hay procesos para portar

No es muy difícil escribir todos los procedimientos almacenados para crearlos en otra base de datos.De hecho - es más fácil que exportar sus tablas porque no hay claves primarias/externas de las que preocuparse.

@Terrapin: los sprocs son igualmente vulnerables a los ataques de inyección.Como ya he dicho:

Siempre parametrice todas las consultas; nunca incluya algo a partir de la entrada del usuario y estará bien.

Eso se aplica a sprocs y SQL dinámico.

No estoy seguro de que no volver a compilar tu aplicación sea una ventaja.Quiero decir, de todos modos ha ejecutado sus pruebas unitarias con ese código (tanto de la aplicación como de la base de datos) antes de volver a funcionar.


@Guy: sí, tienes razón, los sprocs te permiten controlar a los usuarios de la aplicación para que solo puedan realizar el sproc, no la acción subyacente.

Mi pregunta sería:Si todos acceden a través de su aplicación, utilizando conexiones y usuarios con derechos limitados para actualizar/insertar, etc., ¿este nivel adicional agrega seguridad o administración adicional?

Mi opinión es en gran medida la última.Si han comprometido su aplicación hasta el punto de poder reescribirla, tienen muchos otros ataques que pueden usar.

Las inyecciones SQL aún se pueden realizar contra esos sprocs si incorporan código dinámicamente, por lo que la regla de oro aún se aplica: todas las entradas del usuario siempre deben estar parametrizadas.

Algo que no he visto mencionado hasta ahora:Las personas que mejor conocen la base de datos no siempre son las personas que escriben el código de la aplicación.Los procedimientos almacenados brindan a la gente de bases de datos una forma de interactuar con programadores que realmente no quieren aprender mucho sobre SQL.Las bases de datos grandes (y especialmente heredadas) no son las cosas más fáciles de entender por completo, por lo que los programadores podrían preferir una interfaz simple que les brinde lo que necesitan:Dejemos que los DBA descubran cómo unirse a las 17 mesas para que eso suceda.

Dicho esto, los lenguajes utilizados para escribir procedimientos almacenados (PL/SQL es un ejemplo notorio) son bastante brutales.Por lo general, no ofrecen ninguna de las sutilezas que vería en los lenguajes funcionales, imperativo o POO populares de hoy en día.Piense en COBOL.

Por lo tanto, apéguese a procedimientos almacenados que simplemente abstraigan los detalles relacionales en lugar de aquellos que contienen lógica empresarial.

Generalmente escribo código OO.Sospecho que la mayoría de ustedes probablemente también lo hagan.En ese contexto, me parece obvio que toda la lógica empresarial, incluidas las consultas SQL, pertenece a las definiciones de clase.Dividir la lógica de modo que parte resida en el modelo de objetos y otra en la base de datos no es mejor que poner la lógica empresarial en la interfaz de usuario.

Se ha dicho mucho en respuestas anteriores sobre los beneficios de seguridad de los procesos almacenados.Estos se dividen en dos categorías amplias:

1) Restringir el acceso directo a los datos.Esto definitivamente es importante en algunos casos y, cuando te encuentras con uno, los procesos almacenados son prácticamente tu única opción.Sin embargo, en mi experiencia, estos casos son la excepción y no la regla.

2) Inyección SQL/consultas parametrizadas.Esta objeción es una pista falsa.El SQL en línea, incluso el SQL en línea generado dinámicamente, puede parametrizarse tan completamente como cualquier proceso almacenado y se puede realizar con la misma facilidad en cualquier lenguaje moderno que se precie.Aquí no hay ninguna ventaja en ninguno de los dos sentidos.("Es posible que los desarrolladores perezosos no se molesten en usar parámetros" no es una objeción válida.Si tiene desarrolladores en su equipo que prefieren simplemente concatenar datos de usuario en su SQL en lugar de usar parámetros, primero intente educarlos y luego los despida si eso no funciona, tal como lo haría con los desarrolladores que tienen cualquier otro mal hábito, demostrablemente perjudicial.)

Soy un gran partidario del código sobre los SPROC.La razón número uno es mantener el código estrechamente acoplado, luego la segunda es la facilidad del control de fuente sin muchas utilidades personalizadas para incorporarlo.

En nuestro DAL, si tenemos sentencias SQL muy complejas, generalmente las incluimos como archivos de recursos y las actualizamos según sea necesario (esto también podría ser un ensamblado separado e intercambiado por base de datos, etc.).

Esto mantiene nuestro código y nuestras llamadas SQL almacenados en el mismo control de versiones, sin "olvidarnos" de ejecutar algunas aplicaciones externas para actualizar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top