2009-11-19 39 views
6

Tenemos una aplicación escrita en C# que está conectada a un servidor ms sql. Usamos para hacer un procedimiento almacenado para cada llamada a la base de datos, pero luego notamos que usar procedimientos almacenados nos da una gran desventaja, no sabemos qué procedimientos almacenados necesitamos actualizar si cambiamos nuestra base de datos.¿El uso de procedimientos almacenados es una mala práctica?

Ahora me preguntaba si el uso de procedimientos almacenados es algo malo o algo bueno?

+8

Si no sabe qué procedimientos almacenados actualizar cuando cambia su base de datos, eso no es un problema con los procedimientos almacenados, es un problema con quien esté a cargo de la DB – MartW

+0

Estaba pensando lo mismo, pero no lo hice tener el corazón para decirle. – tster

+1

'Ver dependencias' funciona bastante bien para mí, al igual que interrogar a las tablas del sistema. Mucho más fácil que pescar con arrastre para el código de la aplicación para una declaración ACTUALIZADA que está compuesta sobre la marcha. – MartW

Respuesta

6

Eso no es un problema de SP, eso es un problema de su proceso de desarrollo. Si no tiene información que necesita, solo consígala.

Puede hacer un mapa visual simple que muestra su esquema de tabla y SP dependientes. Si su base de datos es demasiado grande para el mapeo visual, agregue el archivo de texto común que consta de sus SP y nombres de las tablas de las que depende.

De todos modos, cuanto más grande sea su base de datos, peor será su trabajo al incluir detalles de su esquema en el código de la aplicación. Cuando usa SP, garantiza que esta funcionalidad no se duplicará y que la mayoría de los cambios ocurrirán en el lado de la base de datos sin la aplicación recompilación y redistribución.

UPD

me olvidó mencionar una cosa más. Las buenas herramientas DB proporcionan una forma fácil de encontrar tablas dependientes para cada SP. En el menú contextual de SP en Microsoft SQL Management Studio, por ejemplo, está el elemento 'Ver dependencias'.

+0

a la derecha, y nuevamente perdí una cosa: esta función también está disponible para las tablas :) – terR0Q

5

Creo que SP son buenos para cálculos/manipulación de datos/fuentes de datos de informes en la base de datos.

Al usarlo únicamente para recuperar datos/actualizaciones de filas de tablas, se encontrará con un mundo de daños.

Este es el enfoque seguido por algunas capas de acceso a datos, y la recuperación de datos sps para una fila individual puede convertirse en un problema.

Así que no, no lo recomendaría como el mejor camino a seguir.

-1

procedimientos de almacenamiento son generalmente una buena cosa:

  • Son más rendimiento inferior querys estándar, especialmente para ciertas operaciones.
  • Ayudan a desacoplar el equipo de diseño de su base de datos del equipo de diseño de su negocio.
  • te dan una buena protección contra la inyección de SQL
  • Ellos le permiten definir fácilmente los permisos de usuario separados para operaciones separadas
1

Los procedimientos almacenados son útiles para hacer cumplir las restricciones a nivel de base de datos. Es más fácil validar un puñado de procedimientos almacenados que restringen el acceso a la base de datos que validar cada bit de código de cliente. Entonces esto los hace buenos.

Aparte de eso, soy un escéptico. Me gusta tener todo en un solo lugar, en un idioma que puedo probar por unidad.

+0

¿No puede probar la unidad los procedimientos almacenados? – tster

+1

En realidad, puede probar los procedimientos almacenados de la prueba. –

+0

SQL Developer, por ejemplo, tiene pruebas de unidad integradas para Oracle PL/SQL. – pierre

1

No se puede decir que sea algo bueno o malo. Tienen ventajas y desventajas y, según el proyecto, su peso puede variar.

Algunas ventajas:

  • Ellos son ejecutadas por el DBMS directamente, así que no hay necesidad de transferencia intermedia de datos a la capa media, en caso de múltiples consultas involucradas (lógica compleja).
  • Le permite tener una sola capa para modificar los datos en db.

Algunas desventajas:

  • Usted tiene la división lógica entre la capa media (C# en su caso) y la capa de persistencia (DB), lo que podría determinar problemas desde el punto de vista del mantenimiento.
+0

Y, sin embargo, la facilidad de modificación es preferible a los nombres de esquema de copiar y pegar pesados ​​:) – terR0Q

2

Hay 2 puntos de vista sobre esto, algunos dicen que son malvados, otros juran por ellos. Tomo una vista de medio camino en esto.

Pros
mantenibilidad, si necesita cambiar la consulta ligeramente sin llegar a impactar otro código, se puede hacer esto sin necesidad de desplegar nuevos montajes de seguridad, no hay ataques de inyección SQL, a menos que romper las mejores prácticas y construir dinámico consultas en el proceso

Contras
Sin documentación y estándares, las cosas pueden salirse rápidamente de control y hacer que el mantenimiento de la base de datos sea una pesadilla.

Sugerencias
Úselos para informar y para operaciones de bases de datos más avanzadas, pero trate de mantenerse alejado para operaciones simples de CRUD.
Mantenga su lógica de negocio fuera de la base de datos, que debería estar en una capa independiente en mi humilde opinión.

+0

Estuve contigo hasta el último punto. La lógica empresarial que debe cumplirse obligatoriamente debe estar incluida en la base de datos, ya que otras cosas además de la aplicación pueden afectar los datos. Si desea integridad de datos, esto pertenece a la base de datos. – HLGEM

+2

La integridad de los datos debe aplicarse en el nivel de base de datos, no necesariamente en la lógica comercial. – baldy

0

Es por eso que necesita una buena documentación y un buen DBA para escribir dicho software.

Los procedimientos almacenados en mi humilde opinión no son malos, se pueden utilizar para muchas cosas útiles como desencadenantes, o realizar algunas consultas complicadas en las que tendría que escribir muchas consultas en el lado del cliente. Pero, por supuesto, no hay nada que solo sea bueno. Algunos inconvenientes que encontré: los procedimientos almacenados pueden causar mucho más trabajo en el lado del servidor (lo que a veces se puede mover al lado del cliente) y, a veces, son difíciles de mantener.

Pero, por otro lado, son muy útiles cuando algún día tendrá que dar acceso a la base de datos a algunos programadores que escriben software en, p. Ej. Java que no podrá usar todas las clases de db que escribió en C#. En ese caso, es bueno tener algo de lógica en la base de datos para que pueda usarla independientemente del cliente o idioma que se use.

1

He trabajado en proyectos que usan mucho los procedimientos almacenados. Básicamente, la capa de negocios se movió a la base de datos, porque el líder del equipo quedó impresionado por algún gurú del oráculo que conoció en su trabajo anterior.

código de procedimiento almacenado es más difícil de mantener que C# (en Visual Studio), ya que las herramientas son peores, la depuración es más difícil etc.

Al mismo tiempo, tener las interfaces claras a sus reglas de datos. Pensar qué consultas se realizarán en la base de datos puede ser algo bueno.

Trate de mantener la generación de la base de datos y el código de migración (actualización) en control de fuente. Incluya procedimientos almacenados allí si realmente los quiere. Mantenga la lógica de procedimientos almacenados lo más simple posible (no haga ninguna lógica comercial, solo cosas de estilo de consistencia). Quizás incluso los genere a partir de una representación más abstracta (junto con el código C# para llamarlos).

0

Los procedimientos almacenados son realmente buenos para las consultas que son muy comunes, que no cambian con frecuencia. Si tiene un SP para "getname" que siempre saca el nombre y el apellido de una tabla, será bueno mantenerlo en el largo plazo. Además, si tiene una consulta muy compleja que podría requerir una gran cantidad de caballos de fuerza en el extremo del cliente, un procedimiento almacenado ayudaría.

Cualquier consulta que podría ser dinámica no debería ser un SP. Si es algo que cambia con frecuencia, o algo a lo que necesita acceso rápido, es una mala idea crear un SP. Aquí está el por qué. Digamos que construyes un buen SP que obtiene un cierto tipo de datos. Tienes 3 proyectos diferentes que lo usan. Pero se necesita algo un poco diferente, por lo que sus opciones son:

  1. cambiar el procedimiento almacenado y el riesgo de romper todas las aplicaciones dependientes
  2. Creación de un nuevo procedimiento almacenado que es muy similar para su función.

Todo en todos los procedimientos almacenados son geniales para algunas necesidades, pero no para otras. Evalúe cuánto pueden cambiar sus necesidades, o cuáles son las desventajas de usar una consulta estándar.

1

Su desea saber si los cambios del esquema DB afectan a SP. Esto significa que el equipo que cambia DB no escribe los SP. En este contexto, alejarse de SP a SQL en línea o ORM no lo ayudará. En lugar de verificar SP, deberá verificar su código. Sugiero que compre buenas herramientas que muestren las dependencias entre sus tablas y SP.

0

Otra gran ventaja de los procedimientos almacenados es que puede realizar cambios en el backend sobre la marcha, sin necesidad de volver a implementar la aplicación (siempre que el prototipo no cambie).

En la gran empresa para la que trabajo, una implementación de código es un ejercicio MAYOR, que requiere al menos 30 días y múltiples aprobaciones. Se puede hacer un cambio en el DB casi de inmediato.

Finalmente, recuerde que los procedimientos almacenados también pueden ofrecer protección contra programadores incorrectos. ¿Tienes un buen DBA pero un equipo de contratistas de oferta más barata escribiendo tu código? El DBA puede escribir procedimientos almacenados y luego eliminar los permisos DML de las tablas, lo que obliga al código a pasar por el procedimiento almacenado para realizar cualquier cambio. De esta forma, no tiene que preocuparse de que algún tipo ponga SQL en el código que borra accidentalmente la mitad del DB.

16

Los procedimientos almacenados han estado cayendo en desgracia durante varios años. El enfoque preferido en estos días para acceder a una base de datos relacional es a través de un asignador O/R como NHibernate o Entity Framework.

  1. Los procedimientos almacenados requieren mucho más trabajo para desarrollar y mantener. Para cada tabla, debe escribir procedimientos almacenados individuales para crear, recuperar, actualizar y eliminar una fila, además de un procedimiento almacenado por separado para cada consulta diferente que desee realizar. Además de eso, debe escribir clases y/o métodos en su código para llamar a cada procedimiento almacenado. Compare eso con un asignador O/R: todo lo que necesita escribir son sus definiciones de clase, su tabla de base de datos y un archivo de mapeo.De hecho, los ORM modernos usan un enfoque basado en convenciones que elimina la necesidad de una definición de mapeo separada.

  2. Los procedimientos almacenados promueven malas prácticas de desarrollo, en particular requieren que viole DRY (No repita), ya que debe escribir la lista de campos en la tabla de la base de datos media docena o más en menos. Esto es un dolor masivo si necesita agregar una sola columna a su tabla de base de datos. No es posible pasar un objeto como parámetro a un procedimiento almacenado, solo tipos simples (cadena, número entero, fecha/hora, etc.) lo que hace casi imposible evitar grandes listas de parámetros (una docena o más).

  3. Los procedimientos almacenados promueven malas prácticas de gestión de configuración. Esto surge del argumento de que los DBA deberían poder modificarlos independientemente del código en sí. Hacer esto da como resultado una versión de su código entrando en producción que nunca ha sido probada de integración, no corresponde a una única revisión específica en control de fuente, y de hecho ni siquiera corresponde a revisión en control de fuente en absoluto. Básicamente, si no tienes un registro auditable, de principio a fin, de exactamente qué revisión de tu código está en producción, vas a tener problemas.

  4. Los procedimientos almacenados tienen que implementarse por separado del cuerpo principal de su código. A menos que tenga un proceso totalmente automatizado para actualizarlos, existe un riesgo dramáticamente mayor de que puedan desincronizarse con su base de código principal en uno o más entornos, introduciendo errores. Esto es especialmente problemático si necesita usar la herramienta de bisección del control de origen para rastrear la revisión que introdujo un error.

  5. Los procedimientos almacenados son inflexibles. Si desea consultar sus datos de varias formas diferentes (diferentes órdenes de clasificación, carga lenta o anhelada, paginación, etc.) tendrá que escribir una multitud de procedimientos almacenados por separado para todos los casos de uso diferentes, mientras que los ORM le dan una flexibilidad, potente lenguaje de consulta (por ejemplo, Linq a NHibernate).

  6. Los procedimientos almacenados requieren reinventar las ruedas. Si necesita simultaneidad optimista, o un patrón de Unidad de trabajo, o carga lenta, o un Mapa de identidad, o manejo de colecciones padre/hijo, o almacenamiento en memoria caché, o asignaciones de jerarquía de clases, o prácticamente cualquiera de los otros patrones de diseño sobre los que lee en el libro de Martin Fowler, Patrones de la arquitectura de aplicaciones empresariales, necesita reconstruir esta funcionalidad desde cero, mientras que un asignador O/R le ofrece todo esto, y más, nada más sacarlo de la caja. Muy a menudo, terminarás reinventando estas ruedas usando el código de copiar y pegar, lo que de nuevo es una mala práctica.

  7. Los procedimientos almacenados son difíciles de probar en una unidad. Con un ORM, puede simular el código de su base de datos para poder probar su lógica comercial rápidamente. Con los procedimientos almacenados, debe reconstruir una base de datos de prueba completa desde cero.

  8. Los procedimientos almacenados no ofrecen ninguna ventaja de rendimiento en absoluto. Las (pequeñas) ganancias que obtiene al pasar solo el nombre del sproc por el cable en lugar de una cadena SQL se compensan fácilmente por el hecho de que es muy probable que termine llamando al mismo procedimiento dos o tres veces con el mismo parámetros en la misma solicitud, mientras que un ORM miraría en su mapa de identidad y diría: "Oye, ya recuperé ese, no es necesario hacer otro viaje de ida y vuelta". Además, la afirmación de que los procedimientos almacenados se almacenan en caché en el servidor, mientras que SQL ad-hoc no lo es, es un mito que fue reventado por Frans Bouma en su blog: "Stored Procedures are bad, m'kay?"

  9. Los procedimientos almacenados ofrecen poca o ninguna ventaja en términos de seguridad, y no lo protegen contra las vulnerabilidades de inyección de SQL.El caso en cuestión:


create procedure GetUsers(@SortOrder nvarchar(50)) 
as 
begin 
    declare @sql nvarchar(100) 
    set @sql = 'SELECT * FROM Users ORDER BY ' + @SortOrder 
    exec @sql 
end 

Por supuesto, se puede escribir procedimientos que no tienen vulnerabilidades de inyección SQL almacenado, pero se puede igualmente escribir SQL ad-hoc en su capa de negocio que no tiene vulnerabilidades de inyección de SQL, mediante consultas parametrizadas. Atribuir protección contra la inyección SQL a los procedimientos almacenados, en lugar de no romper cadenas de SQL juntas, es una pista falsa y totalmente engañosa.

Cuestiones relacionadas