from - sistema de notificaciones c#




¿Cuáles son los pros y los contras de mantener SQL en Procesados almacenados versus código (20)

Ventajas para en código:

  • 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 de puerto

En realidad, creo que tienes eso al revés. En mi humilde opinión, SQL en código es un dolor para mantener porque:

  • terminas repitiéndote en bloques de código relacionados
  • SQL no es compatible como idioma en muchos IDE, por lo que solo tiene una serie de cadenas verificadas sin error que realizan tareas para usted
  • los cambios en un tipo de datos, nombre de tabla o restricción son mucho más frecuentes que el intercambio de 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 Stored Procs como métodos a los 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 de proveedor de DB, los cambios se produzcan en sus Stored Procs y no en su código. .

Dicho esto, las mejoras 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 (aún).

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

Hasta ahora tengo:

Ventajas para en código:

  • 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 de puerto

Ventajas para Procs almacenados:

  • Actuación
  • Seguridad

@Keith

¿Seguridad? ¿Por qué sprocs sería más seguro?

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

(Por supuesto, la ejecución de sprocs puede darles 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).


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 la base de datos una forma de interactuar con los programadores que realmente no quieren aprender mucho sobre SQL. Las bases de datos grandes, y especialmente las heredadas, no son las cosas más fáciles de entender por completo, por lo que los programadores pueden preferir una interfaz simple que les brinde lo que necesitan: deje que los administradores de bases de datos descubran cómo unirse a las 17 tablas para que esto 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ías en los imperativos populares de hoy, OOP o lenguajes funcionales. Piensa COBOL.

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


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

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

Definitivamente más fácil de mantener si lo pones en un procedimiento almacenado. Si hay una lógica complicada involucrada que podría cambiar en el futuro, definitivamente es una buena idea colocarla en la base de datos cuando tenga varios clientes conectados. Por ejemplo, estoy trabajando en una aplicación en este momento que tiene una interfaz web de usuario final y una aplicación administrativa de escritorio, las cuales comparten una base de datos (obviamente) y estoy tratando de mantener la mayor lógica posible en la base de datos. Este es un ejemplo perfecto del principio DRY .


En algunas circunstancias, el código SQL creado de forma dinámica puede tener un mejor rendimiento que un proceso almacenado. Si ha creado un proceso almacenado (digamos, sp_customersearch) que se complica mucho 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 traslada algo de procesamiento de SQL al servidor web, pero en general eso sería bueno.

La otra gran cosa acerca de esta técnica es que si está buscando en el analizador de SQL, puede ver la consulta que generó y depurarla mucho más fácilmente que cuando se recibe una llamada de proceso almacenada con 20 parámetros.


Enumeras 2 puntos-pro para sprocs:

Rendimiento - no realmente. En Sql 2000 o superior, las optimizaciones del plan de consulta son bastante buenas y se almacenan en caché. Estoy seguro de que Oracle, etc., hacen cosas similares. No creo que haya un caso para sprocs para el rendimiento más.

¿Seguridad? ¿Por qué sprocs sería más seguro? De todos modos, a menos que tenga una base de datos bastante segura, todo el acceso será desde sus DBA o a través de su aplicación. Siempre parametrice todas las consultas; nunca incluya información de la entrada del usuario y estará bien.

Esa es la mejor práctica para el rendimiento de todos modos.

Linq es definitivamente la forma en que me gustaría ir a un nuevo proyecto ahora mismo. Ver este post similar .


Esto se está discutiendo en algunos otros hilos aquí actualmente. Soy un partidario constante de los procedimientos almacenados, aunque se presentan algunos buenos argumentos para Linq a Sql.

Al incrustar consultas en su código, usted 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 ser 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 otra discusión actual


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

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

1) Restricción del acceso directo a los datos. Esto definitivamente es importante en algunos casos y, cuando se encuentra con uno, los procedimientos almacenados son prácticamente su única opción. En mi experiencia, tales casos son la excepción y no la regla, sin embargo.

2) Inyección de 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 ser tan completamente parametrizado como cualquier proceso almacenado y puede hacerse con la misma facilidad en cualquier lenguaje moderno que valga la pena. No hay ventaja de ninguna manera aquí. ("Los desarrolladores perezosos pueden no molestarse en usar parámetros" no es una objeción válida. Si tiene desarrolladores en su equipo que prefieren concatenar datos de usuario en su SQL en lugar de usar parámetros, primero intente educarlos y luego los descarte si eso no funciona, al igual que lo haría con los desarrolladores que tienen algún otro hábito malo y demostrablemente perjudicial.)


La ventaja de rendimiento para los procedimientos almacenados es a menudo despreciable.

Más ventajas para los procedimientos almacenados:

  • Evitar la ingeniería inversa (si se crea 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 múltiples programas acceden al mismo modelo de datos

Me caigo en el lado del código . Construimos la 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 y la base de datos.

No tengo mucho problema con el acoplamiento apretado 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.


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

Gran fanático de Transact SQL, la optimización de consultas grandes ha demostrado ser muy útil para mí. No he escrito ningún SQL en línea en aproximadamente 6 años!


No soy un gran fanático de los procedimientos almacenados, pero los uso en una condición:

Cuando la consulta es bastante grande, es mejor almacenarla en la base de datos como un procedimiento almacenado en lugar de enviarlo desde el código. De esa manera, en lugar de enviar grandes cantidades de caracteres de cadena desde el servidor de la aplicación a la base de datos, solo se "EXEC SPNAME" comando "EXEC SPNAME" .

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

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


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 se dio cuenta de que hay un pequeño problema con el código SQl, así que prefiera ... cambiar el proceso en 1 lugar o presionar el código a todos los servidores web, reinstalar todas las aplicaciones de escritorio (clickonce podría ayudar) en todos los cuadros de ventanas

Prefiero los procedimientos almacenados

También es más fácil realizar pruebas de rendimiento contra un proc, ponerlo en el analizador de consultas establecer estadísticas io / time en el set showplan_text on and voila

no hay necesidad de ejecutar perfilador para ver exactamente lo que se llama

solo mis 2 centavos


Procedimientos almacenados.

Si se produce un error o la lógica cambia un poco, no tiene que volver a compilar el proyecto. Además, permite el acceso desde diferentes fuentes, no solo al 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 en archivos separados primero, luego puede ejecutarlos en cualquier base de datos que necesite configurar.


Soy un gran partidario de código sobre SPROC. El número uno de los motivos es mantener el código estrechamente acoplado, luego el segundo es la facilidad de control de la fuente sin muchas utilidades personalizadas para utilizarlo.

En nuestro DAL, si tenemos sentencias de SQL muy complejas, generalmente las incluimos como archivos de recursos y las actualizamos según sea necesario (esto también podría ser un ensamblaje separado, y se intercambiarán por db, etc.).

Esto mantiene nuestro código y nuestras llamadas sql almacenadas en el mismo control de versión, sin "olvidar" ejecutar algunas aplicaciones externas para actualizar.


Una de las sugerencias de las sesiones de Microsoft TechEd sobre seguridad a las que asistí, para realizar todas las llamadas a través de procedimientos almacenados y denegar el acceso directamente a las tablas. Este enfoque fue facturado como proporcionar seguridad adicional. No estoy seguro de si vale la pena solo por seguridad, pero si ya está utilizando procs almacenados, no podría hacer daño.


Usa el código de tu aplicación como lo hace mejor: maneja la lógica.
Usuario de su base de datos para lo que hace mejor: almacenar 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 volver a compilar 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 poco eficientes porque tiene que especificar de antemano todos los parámetros posibles y las búsquedas complejas a veces no son posibles porque no puede predecir cuántas veces se repetirá un parámetro en la búsqueda.


ESTAFA

Me parece que hacer mucho procesamiento dentro de los procedimientos almacenados haría de su servidor DB un único punto de inflexibilidad, cuando se trata de escalar su acción.

Sin embargo, hacer todo ese proceso de contracción en su programa en lugar del servidor SQL puede permitirle 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 procesos como el bucle sobre conjuntos de datos.

PROS

  1. Rendimiento para lo que puede valer (evita el análisis de consultas por el controlador de DB / recreación del plan, etc.)
  2. La manipulación de datos no está incorporada 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 ver 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 tiene que dar el mismo resultado al código y funcionará bien
  5. Más fácil de portar a una base de datos diferente.
  6. Puedo listar permisos individuales en mis procedimientos almacenados y controlar el acceso a ese nivel también.
  7. Puedo perfilar mi consulta de datos / código de persistencia 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 de un cliente.
  9. Es más fácil usar algunas herramientas automatizadas para convertir mi esquema y mis declaraciones en lugar de hacerlo cuando está incrustado dentro de mi código, donde tendría que buscarlos.
  10. Asegurar las mejores prácticas para el acceso a los datos es más fácil cuando tiene todo su código de acceso a los datos dentro de un solo archivo. Puedo verificar las consultas que acceden a la tabla de no rendimiento o que utiliza un mayor nivel de serialización o seleccionar * 's 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 archivo.
  12. Se vuelve más fácil buscar y reemplazar ediciones en SQL cuando están en el mismo lugar, por ejemplo, modificar / agregar declaraciones de aislamiento de transacción para todos los procesos almacenados.
  13. El tipo DBA y yo encontramos que tener un archivo SQL separado es más fácil / conveniente cuando el DBA tiene que revisar mis cosas de SQL.
  14. Por último, no tiene que preocuparse por los ataques de inyección de SQL porque algunos miembros perezosos de su equipo no usaron consultas parametrizadas cuando usaron sqls incrustados.

Troncos más pequeños

Otro problema menor para los procedimientos almacenados que no se ha mencionado: cuando se trata del tráfico de SQL, el acceso a datos basados ​​en sp genera mucho menos tráfico. Esto es importante cuando monitorea el tráfico para el análisis y la creación de perfiles: los registros serán mucho más pequeños y legibles.





stored-procedures