¿Los procedimientos almacenados son una mala práctica en una de las empresas de consultoría de software de TI más grandes del mundo?


148

Estoy trabajando en un proyecto en una de las 3 principales firmas de consultoría de TI del mundo, y un DBA me dijo que los procedimientos almacenados por el estado de las mejores prácticas de la compañía no son una "mejor práctica". Esto es muy contrario a todo lo que he aprendido.

Los procedimientos almacenados le brindan reutilización de código y encapsulación (dos pilares del desarrollo de software), seguridad (puede otorgar / revocar permisos en un proceso almacenado individual), protegerlo de ataques de inyección SQL y también ayudar con la velocidad (aunque ese DBA dijo que comenzando con SQL Server 2008 que incluso las consultas SQL regulares se compilan si se ejecutan suficientes veces).

Estamos desarrollando una aplicación compleja utilizando la metodología de desarrollo de software ágil. ¿Alguien puede pensar en buenas razones por las que no desearían usar procedimientos almacenados? Supuse que los DBA no querían mantener esos procesos almacenados, pero parece haber demasiados negativos para justificar tal decisión de diseño.


3
¿Qué reutilización de código agrega? ¿Qué pasa si su cliente utiliza una base de datos diferente? Tiene que tirar a la basura todos esos SP y comenzar desde cero. No lo proteja de la inyección sql. La velocidad es mínima en la mayoría de los casos.
Plataforma

32
Tenga en cuenta que la mayoría de las grandes empresas de consultoría de TI tienen el motivo de maximizar las horas facturables mientras mantienen su trasero cubierto. Los veteranos con alguna influencia en estas empresas también tienden a ser jugadores y burócratas en lugar de técnicos. Tomaría cosas así de una empresa de consultoría con un grano de sal: he conseguido sacar a las empresas de consultoría de la mierda en más de una ocasión al arreglar su "mejor" práctica.
Preocupado por

1
La reutilización del código @Rig se agrega tal como lo es para las funciones de cualquier idioma, envolviendo el código en un contenedor reutilizable. Ciertamente, los procedimientos almacenados lo protegen de la inyección de SQL siempre que no ejecute una cadena que ha creado. Decir que la velocidad es mínima parece simplemente sin educación. La mayoría de los casos no entran en las mismas categorías en cuanto a beneficios de rendimiento, pero muestran una gran disparidad.
Garet Claborn

1
@GaretClaborn Pero es mucho más probable que rediseñe la capa de aplicación que años y años de datos históricos de bases de datos. En cualquier aplicación no trivial, de todos modos. Y si lo hace, pasará meses portando código enriquecido de procedimiento almacenado. Hay pocos beneficios al agregar una dependencia más a su proyecto, excepto en situaciones de caso límite. Esos existen, pero la mayoría de las veces es solo agregar un obstáculo más para la agilidad del proyecto y la reutilización del código.
Plataforma

2
Viniendo de un entorno en el que usamos sps casi exclusivamente, puedo decirle el beneficio de alejarse de ellos y usar un ORM como Entity Framework. Demasiadas veces la lógica empresarial se encapsula dentro del procedimiento. Si bien puede versionar procs con algunas herramientas de trabajo o de terceros. No es tan fácil como lo sería hacerlo dentro de un marco como TFS o GIT. El código de su base de datos que se emite es independiente de su proveedor de RDBMS. Por lo tanto, puede cambiar de proveedor RDBMS en una fecha posterior con menos dolor de cabeza.
ewahner

Respuestas:


280

En mi experiencia trabajando en proyectos muy grandes, debes tener muy claro dónde vive la lógica de negocios. Si permite un entorno donde los desarrolladores individuales pueden poner la lógica de negocios en la capa de objetos de negocio o en un procedimiento almacenado como mejor les parezca, una aplicación grande se vuelve MUY difícil de entender y mantener.

Los procedimientos almacenados son excelentes para acelerar ciertas operaciones de DB. Mi decisión arquitectónica es dejar toda la lógica en la capa empresarial de la aplicación y emplear procedimientos almacenados de manera específica para mejorar el rendimiento donde la evaluación comparativa indica que está justificado.


37
No veo las cosas así de simple. Para mí, es TODA la lógica de negocios. La base de datos, con o sin procedimientos almacenados, proporciona ciertos servicios y ofrece ciertas garantías. Idealmente, debería ser imposible que un código de aplicación incorrecto ponga la base de datos en un estado inconsistente. Si se necesitan procedimientos almacenados para mantener esa consistencia, los uso.
Kevin Cline

12
@kevin cline: Definir "estado inconsistente". Estoy de acuerdo en que las características de DB, como la integridad referencial, son valiosas y reducen en gran medida la posibilidad de que un error de la aplicación cause daños graves. Sin embargo, en términos generales, la definición de "datos consistentes" depende de la correcta ejecución de las reglas comerciales.
Eric J.

16
agrega mi millón al millón de Mayo. La lógica comercial distribuida lo lleva fuera de la carretera de las buenas prácticas, directo al camino de la locura
Nico

27
+1 La lógica empresarial que se filtra en el DAL es una gran preocupación cuando se utilizan procedimientos almacenados.
Sistema

30
@ChristopherMahan, NUNCA querría usar una base de datos que diseñe. Esa es la peor práctica posible desde una perspectiva de base de datos. Las bases de datos a menudo se ven afectadas directamente en la base de datos. Es miope pensar que alguien usará la capa empresarial para actualizar un millón de registros u otras cosas que suceden con el tiempo. Las importaciones normalmente no pasan por la capa empresarial (sí, quiero procesar mi importación de 21 millones de registros un registro a la vez en la capa empresarial). El fraude es mucho más fácil cuando no tienes restricciones a nivel de base de datos. Los datos incorrectos son casi 100% seguros.
HLGEM

163

Algunas observaciones

Los procedimientos almacenados le permiten reutilizar el código y encapsular (dos pilares del desarrollo de software),

Solo si los usa correctamente en el contexto en el que se supone que deben usarse. Se puede decir lo mismo sobre las funciones (en la programación estructurada) o los métodos (en la programación orientada a objetos) y, sin embargo, vemos funciones 1K y objetos mega-ass.

Los artefactos no te dan esos beneficios. El uso adecuado de esos artefactos es lo que da esos beneficios.

seguridad (puede otorgar / revocar permisos en un proceso almacenado individual),

Si. Este es un buen punto y una de las razones principales por las que me gustan los procedimientos almacenados. Proporcionan un control de acceso de granularidad más fino que el que normalmente se puede lograr con solo vistas y cuentas de usuario.

protegerte de los ataques de inyección SQL,

Eso no es específico de los SP ya que puede lograr el mismo nivel de protección con sentencias SQL parametrizadas y depuración de entrada. Sin embargo, usaría SP además de esos, como cuestión de "seguridad en profundidad" .

y también ayuda con la velocidad (aunque ese DBA dijo que a partir de SQL Server 2008 que incluso las consultas SQL regulares se compilan si se ejecutan suficientes veces).

Esto es altamente específico del proveedor de la base de datos, pero en general su DBA es correcto. Las declaraciones SQL (estáticas o parametrizadas) se compilan. Los SP ayudan si desea / necesita agregar y calcular datos que no puede hacer con declaraciones SQL simples, pero que están estrechamente integradas con SQL y no garantiza el viaje de ida y vuelta al servidor de aplicaciones.

Un buen ejemplo es consultar datos en un cursor (o cursores) temporal desde el cual ejecutar otro SQL. Puede hacerlo mediante programación en el servidor de aplicaciones, o puede guardar los múltiples viajes de ida y vuelta al hacerlo en la base de datos.

Sin embargo, esto no debería ser la norma. Si tiene muchos de esos casos, eso es una señal de un mal diseño de la base de datos (o está extrayendo datos de esquemas de bases de datos no tan compatibles entre departamentos).

Estamos desarrollando una aplicación compleja utilizando la metodología de desarrollo de software ágil.

La agilidad tiene que ver con los procesos de ingeniería de software y la gestión de requisitos, y no con las tecnologías.

¿Alguien puede pensar en buenas razones por las que no desearían usar procedimientos almacenados?

Pregunta equivocada

La pregunta es incorrecta y equivale a preguntar "¿hay alguna buena razón para no usar GOTO"? Estoy más de acuerdo con Niklaus Wirth que con Dijkstra en este tema. Puedo entender de dónde vino el sentimiento de Dijkstra, pero no creo que sea 100% aplicable en todos los casos. Lo mismo con los accesorios de la tienda y cualquier tecnología.

Una herramienta es buena cuando se usa bien para su propósito previsto, y cuando es la mejor herramienta para la tarea en particular. Usarlo de otra manera no es una indicación de que la herramienta está mal, sino que el usuario no sabe lo que está haciendo.

La pregunta correcta es "qué tipo de patrones de uso de procedimientos almacenados se deben evitar". O "bajo qué condiciones debo (o no) usar procedimientos almacenados" . Buscar razones para no utilizar una tecnología es simplemente echarle la culpa a la herramienta en lugar de colocar la responsabilidad de ingeniería directamente donde pertenece: en el ingeniero.

En otras palabras, es una evasión o una declaración de ignorancia.

Supuse que los DBA no querían mantener esos procesos almacenados, pero parece haber demasiados negativos para justificar tal decisión de diseño.

Lo que están haciendo es proyectar los resultados de sus malas decisiones de ingeniería sobre las herramientas que usaron mal.

¿Qué hacer en tu caso?

Mi experiencia es, cuando en Roma, hacer lo que hacen los romanos .

No luches contra eso. Si la gente de su empresa quiere etiquetar los procedimientos de la tienda como una mala práctica, déjelos. Sin embargo, tenga en cuenta que esto puede ser una señal de alerta en sus prácticas de ingeniería.

El etiquetado típico de las cosas como mala práctica generalmente se realiza en organizaciones con toneladas de programadores incompetentes. Al hacer una lista negra de ciertas cosas, la organización trata de limitar el daño infligido internamente por su propia incompetencia. No te cago.

Las generalizaciones son la madre de todos los errores. Decir que los procesos almacenados (o cualquier tipo de tecnología) son una mala práctica, es una generalización. Las generalizaciones son evasivas para los incompetentes. Los ingenieros no trabajan con generalizaciones descaradas. Realizan análisis caso por caso, analizan compensaciones y ejecutan decisiones y soluciones de ingeniería de acuerdo con los hechos en cuestión, en el contexto en el que se supone que deben resolver un problema.

Los buenos ingenieros no etiquetan las cosas como malas prácticas en formas tan generalizadas. Analizan el problema, seleccionan la herramienta adecuada y hacen compensaciones. En otras palabras, hacen ingeniería.

Mi opinión sobre cómo no usarlos

  • No ponga lógica compleja más allá de la recopilación de datos (y quizás algunas transformaciones) en ellos. Está bien poner alguna lógica de masaje de datos en ellos, o agregar el resultado de múltiples consultas con ellos. Pero eso es todo. Cualquier cosa más allá de eso calificaría como lógica de negocios que debería residir en otro lugar.

  • No los use como su único mecanismo de defensa contra la inyección SQL. Los deja allí en caso de que algo malo les llegue , pero debe haber una gran cantidad de lógica defensiva frente a ellos: validación / depuración del lado del cliente, validación / depuración del lado del servidor, posiblemente transformación en tipos que tengan sentido en su modelo de dominio, y finalmente pasar a declaraciones parametrizadas (que podrían ser declaraciones SQL parametrizadas o procesos almacenados parametrizados).

  • No hagas de las bases de datos el único lugar que contenga tus accesorios de la tienda. Los procs de tu tienda deben tratarse tal como tratas tu código fuente C # o Java. Es decir, la fuente controla la definición textual de los procs de tu tienda. La gente dice que los procs de la tienda no pueden ser controlados por la fuente: bullcrap, simplemente no saben de qué demonios están hablando.

Mi opinión sobre cómo / dónde usarlos

  • Su aplicación requiere datos que deben transponerse o agregarse desde múltiples consultas o vistas. Puede descargar eso desde la aplicación a la base de datos. Aquí debe hacer un análisis de rendimiento ya que a) los motores de bases de datos son más eficientes que los servidores de aplicaciones para hacer estas cosas, pero b) los servidores de aplicaciones son (a veces) más fáciles de escalar horizontalmente.

  • Control de acceso de grano fino. No desea que algún idiota ejecute uniones cartesianas en su base de datos, pero tampoco puede prohibir a las personas que ejecuten sentencias SQL arbitrarias así. Una solución típica es permitir sentencias SQL arbitrarias en entornos de desarrollo y UAT, al tiempo que las prohíbe en entornos sistemáticos y de producción. Cualquier declaración que deba llegar al sistema o producción entra en un procedimiento de tienda, revisado por código tanto por desarrolladores como por dbas.

Cualquier necesidad válida de ejecutar una instrucción SQL que no esté en un proceso de tienda pasa por un nombre de usuario / cuenta diferente y un grupo de conexiones (con el uso altamente monitoreado y desaconsejado).

  • En sistemas como Oracle, puede obtener acceso a LDAP o crear enlaces simbólicos a bases de datos externas (por ejemplo, llamar a un proceso de tienda en la base de datos de un socio comercial a través de vpn). Una forma fácil de hacer código de espagueti, pero eso es cierto para todos los paradigmas de programación, y a veces tiene requisitos empresariales / ambientales específicos para los cuales esta es la única solución. Los procs de la tienda ayudan a encapsular esa maldad en un solo lugar, cerca de los datos y sin tener que atravesar el servidor de aplicaciones.

Si ejecuta esto en la base de datos como un proceso de tienda o en su servidor de aplicaciones depende del análisis de compensación que usted, como ingeniero, debe hacer. Ambas opciones deben analizarse y justificarse con algún tipo de análisis. Ir de una forma u otra simplemente acusando a la otra alternativa como "mala práctica", eso es solo una cojera ingenua.

  • En situaciones en las que simplemente no puede escalar su servidor de aplicaciones (es decir, no hay presupuesto para hardware nuevo o instancias en la nube) pero con mucha capacidad en el back-end de db (esto es más típico de lo que muchas personas quieren admitir), paga para mover la lógica de negocios para almacenar procs. No es bonito y puede conducir a modelos de dominio anémico ... pero, de nuevo ... análisis de compensación, lo que la mayoría de los piratas informáticos apestan.

Si eso se convierte en una solución permanente o no, eso es específico de las restricciones observadas en ese momento en particular.

Espero eso ayude.


14
Esta es una muy buena respuesta.
yfeldblum

55
Buena respuesta, pero ¿pretendía ser irónico? "Las generalizaciones son la madre de todos los errores".
bedwyr

2
Sí y no. Ese comentario mío estaba destinado a esta oración en particular referida por el OP en su pregunta original (los procedimientos almacenados no son una "mejor práctica" ). Una descripción aproximada de los procedimientos de la tienda como mejor o mala práctica es una generalización. Ignorando el contexto en el que pueden ser buenos O malos pueden (y a menudo conducirán) a
errores al

77
+1 para "El etiquetado típico de las cosas como mala práctica generalmente se realiza en organizaciones con toneladas de programadores incompetentes". - Estuve allí, viví eso, incluido el hecho de que un gerente de desarrollo me dijo que creía que tenía una gran solución para un problema complicado, pero si se veía que me permitía implementarlo, abriría las compuertas para el Muppets
Julia Hayward

1
@ Shane Tienes razón. Sin embargo, creo que lo que esta respuesta está tratando de transmitir es la tendencia de algunos grupos de ingenieros a disculpar su falta de conocimiento o análisis llamando a la tarjeta de malas prácticas. Sin embargo, la respuesta podría ver alguna mejora para los más inexpertos.
Cesar Hernández el

56

La razón es que confiar en una capa de procedimiento almacenado limita la portabilidad y lo vincula a un determinado DB. Los costos de mantenimiento adicionales también se citan como una razón. También quería comentar sobre este punto que hizo:

(procedimientos almacenados) lo protegen de los ataques de inyección SQL

En realidad, son las consultas parametrizadas las que lo protegen, lo que puede hacer fácilmente en consultas SQL sin formato.


18
Y si su proceso almacenado está utilizando cualquier tipo de sql dinámico junto con un parámetro de cadena, está de vuelta donde comenzó.
JeffO

44
La diferencia es que el permiso de acceso se puede establecer para los procedimientos almacenados según el procedimiento, para las consultas SQL parametrizadas, debe confiar en la cordura de los programadores para no hacerlo + "blablabla"porque debe permitir SQL simple, y ahí es donde termina el control.
Codificador

19
Nunca he entendido el argumento de "te ata a un determinado DB". ¿Con qué frecuencia toma su programa y lo migra a una base de datos completamente diferente?
Mason Wheeler

11
@MasonWheeler: +1 cada vez. En cualquier proyecto lo suficientemente grande, su aplicación termina siendo escrita contra las debilidades de un producto DB dado. La conversión a otra base de datos se convierte en un trabajo importante, ya que la nueva base de datos tendrá diferentes rarezas
Michael Kohne

66
@HLGEM, pero en el mundo COTS, se esperan Múltiples bases de datos desde el principio (de hecho, usted elige las bases de datos compatibles). No es que portes, es que soportas diferentes back-end, que es una bestia completamente diferente a hacer un puerto.
Michael Kohne

46

Algunas de las razones por las que estoy de acuerdo con los procedimientos almacenados no son una buena práctica.

  • La lógica de negocios y aplicaciones debe estar en el código, no en la base de datos. Poner lógica en la base de datos está confundiendo preocupaciones.
  • No puede probar los procesos almacenados tan fácilmente como el código en sus proyectos de pruebas unitarias convencionales con el resto de la lógica de la aplicación.
  • No encuentro los procesos almacenados como propicios para probar la primera programación cuando estoy escribiendo código.
  • Los procesos almacenados no son tan fáciles de depurar como el código de la aplicación cuando depura su programa en su IDE.
  • Control de versiones / control de fuente de SP vs. código normal

77
También puede hacer fácilmente la programación de prueba primero en los procedimientos almacenados.

55
Hmmm, bueno ... 1) El uso de procedimientos almacenados de db no implica necesariamente que se les ponga lógica de negocios. 2) los procs almacenados son algunas de las cosas más fáciles de probar. 3) los procs de la tienda no necesariamente conducen las prácticas de prueba primero, es cierto, pero no todo lo que es computable puede probarse primero. 4) la depuración no debería ser un problema ya que los procs de la tienda no deberían contener más que sentencias y cursores SQL fáciles de verificar. Además, la depuración debe llevarse a cabo primero probando y depurando las instrucciones SQL en el código, y luego moviéndose a los procesos de la tienda ... solo IMO por cierto.
luis.espinal

66
Obviamente no eres un desarrollador de DB. Control de fuente, IDEs: es muy fácil depurar un SP si está utilizando TOAD o un IDE similar, lo mismo con el control de versiones.
gbjbaanb

66
2) en pruebas unitarias de procs almacenados. idk sobre otros marcos de prueba de unidad, pero al menos con MS Test (VisualStudio.TestTools.UnitTesting), ejecutar cualquiera de los métodos Assert en el proceso almacenado al menos requiere una conexión Db, que por definición lo hace más una prueba de integración que una unidad prueba. Y un proceso almacenado puede hacer referencia al estado de la base de datos a nivel global de base de datos. Estos pueden no ser falsos o tener interfaces.
T. Webster

3
+1 Además, los lenguajes de procedimientos almacenados (pl / sql, t-sql, plpgsql, etc.) son muy torpes y detallados. Es mucho más fácil para mí usar un lenguaje de script para hacer una conexión de base de datos y manejar la lógica de negocios fuera de la base de datos.

22

Los procedimientos almacenados le permiten reutilizar el código y encapsular (dos pilares del desarrollo de software),

Sí, pero a costa de poder alcanzar otros objetivos de diseño ágiles. Son más difíciles de mantener, por un lado. Si el proyecto en el que estoy es una indicación, es probable que termines con múltiples SP incompatibles que hacen esencialmente el mismo trabajo, sin ningún beneficio.

protegerte de los ataques de inyección SQL,

No ellos no. Ni siquiera puedo comenzar a adivinar de dónde podría haber surgido esta idea, como lo escucho decir a menudo, y simplemente no es cierto. Puede mitigar ciertos tipos de ataques de inyección SQL, pero si no está utilizando consultas parametrizadas en primer lugar, eso no importará. Todavía puedo '; DROP TABLE Cuentas -

y también ayuda con la velocidad (aunque ese DBA dijo que a partir de SQL Server 2008 que incluso las consultas SQL regulares se compilan si se ejecutan suficientes veces).

También suelen compilarse cuando usa declaraciones preparadas y parametrizadas (al menos con varias de las bases de datos que he usado). Cuando su aplicación comienza a ejecutar la consulta (o especialmente cuando ejecuta la misma consulta preparada varias veces), cualquier ventaja de rendimiento que cree que tiene su SP es completamente discutible.

La única razón para usar un procedimiento almacenado, en mi humilde opinión, es cuando debe hacer una consulta compleja y de varias etapas que extrae de múltiples fuentes clasificadas. Los SP no deberían contener una lógica de decisión de bajo nivel, y nunca deberían simplemente encapsular una consulta simple. No hay beneficios y solo muchos inconvenientes.

Escucha a tu DBA. Él sabe lo que pasa.


1
Red Gate tiene un producto de control de código fuente SQL para SQL Server, pero estoy de acuerdo, empujar la lógica a los procesos almacenados es una excelente manera de garantizar que tenga una lógica importante que no esté bajo ningún tipo de control de versión.
Carson63000

17
@greyfade - "Todavía no he visto el control de fuente para los SP" - ¿me estás tomando el pelo? Un proc de la tienda es solo un archivo de texto con sangre que carga en el motor de su base de datos (que lo toma, lo compila y lo instala para su ejecución). En cada lugar donde he trabajado que tiene procs almacenados, almacenamos el código fuente del proc de la tienda, digamos, CVS, clearcase o cualquier SCM que estaba en uso. Decir que los procs de la tienda no pueden controlarse en origen (porque están en la base de datos) es como decir que el código fuente de mi aplicación (Java, C # o lo que sea) no puede controlarse en origen porque se compila e implementa en producción.
luis.espinal

2
@ luis.espinal: No dije que no podían estar en control de la fuente. Simplemente dije que no conocía una herramienta específica para mantener el historial de SP, lo que implicaba mantener ese historial dentro de la base de datos. Por favor, no me grites solo porque hayas leído mal algo.
greyfade

1
Todos los procedimientos almacenados de Opur están bajo control de origen, solo porque haya visto malas prácticas en el pasado no significa que sean inherentes al uso de procedimientos almacenados.
HLGEM

1
@ luis.espinal ¿es típico que la fuente de un procedimiento almacenado pueda recuperarse más tarde de la base de datos? Si es así, puede tener una herramienta que la extraiga regularmente y tener otras herramientas en su lugar para recrear una instalación desde cero. Hazlo de vez en cuando para asegurarte de que sea preciso.

17

Esta fue la línea oficial cuando trabajé para uno de los Big Five hace unos años. La razón era que, dado que los SP están vinculados a implementaciones particulares (PL / SQL vs T / SQL vs ...), limitan innecesariamente las opciones tecnológicas.

Habiendo vivido la migración de un sistema grande de T / SQL a PL / SQL, puedo entender el argumento. Sin embargo, creo que es un poco tonto: ¿cuántos lugares realmente se mueven de una base de datos a otra por capricho?


10
@DaveE: Para una solución empresarial, probablemente tenga razón. Si está creando software empaquetado, tan pronto como realice el envío en MSSQL, su mayor perspectiva querrá que se ejecute en Oracle.
Eric J.

3
@Eric: demasiado cierto. Donde estoy ahora, usamos toneladas de SP y le decimos a la gente 'no' si no quieren MSSQL. Es bueno poder hacer eso.
DaveE

3
@DaveE: ¿El equipo de ventas desea que puedas decir "sí"?
Eric J.

2
No es tanto mover un sistema de una base de datos a otra, sino tener un sistema capaz de utilizar cualquier sistema de base de datos que el cliente ya tenga. Las grandes bases de datos son caras.

@EricJ: sí, pero una vez que ven lo que el costo le haría a su comisión, la solicitud desaparece.
DaveE

17

Las tres empresas para las que trabajo utilizan procedimientos almacenados para su lógica de aplicación con SQL Server. Realmente no he visto las cosas al revés. Pero para mí son un gran desastre. Por lo general, no hay muy buenas instalaciones de manejo de errores o instalaciones de reutilización de código con procedimientos almacenados.

Digamos que tiene un procedimiento almacenado que devuelve un conjunto de datos que desea usar, ¿cómo puede usarlo en futuros procedimientos almacenados? Los mecanismos en SQL Server para eso no son muy buenos. EJECUTAR EN ... solo funciona en uno o dos niveles) de anidamiento (lo olvido ahora). O tiene que predefinir una tabla de trabajo y hacer que procese la clave. O necesita crear previamente una tabla temporal y hacer que el procedimiento la complete. Pero, ¿qué pasa si dos personas llaman a una tabla temporal lo mismo en dos procedimientos diferentes que nunca planearon usar al mismo tiempo? En cualquier lenguaje de programación normal, puede devolver una matriz de una función o señalar a un objeto / estructura global compartida entre ellos (excepto los lenguajes funcionales donde devolvería la estructura de datos en lugar de simplemente cambiar una estructura global ... )

¿Qué tal la reutilización del código? Si comienza a poner expresiones comunes en UDF (o incluso peores subconsultas), ralentizará el código. No puede llamar a un procedimiento almacenado para realizar un cálculo para una columna (a menos que use un cursor, pase los valores de la columna uno por uno y luego actualice su tabla / conjunto de datos de alguna manera). Básicamente, para obtener el máximo rendimiento, debe cortar / pegar expresiones comunes en todo el lugar, lo cual es una pesadilla de mantenimiento ... Con un lenguaje de programación, puede crear una función para generar el SQL común y luego llamarlo desde cualquier lugar al construir La cadena SQL. Luego, si necesita ajustar la fórmula, puede hacer el cambio en un solo lugar ...

¿Qué tal el manejo de errores? SQL Server tiene muchos errores que inmediatamente detienen la ejecución del procedimiento almacenado y algunos incluso fuerzan una desconexión. Desde 2005 hay try / catch pero todavía hay una serie de errores que no se pueden detectar. También ocurre lo mismo con la duplicación de código en el código de manejo de errores y realmente no puede pasar las excepciones tan fácilmente o subirlas a niveles más altos tan fácilmente como la mayoría de los lenguajes de programación .....

También solo velocidad. Muchas operaciones en conjuntos de datos no están orientadas a SET. Si intentas hacer cosas orientadas a filas, o vas a usar un cursor, o vas a usar un "cursor" (cuando los desarrolladores a menudo consultan cada fila una por una y almacenan el contenido en variables @ como un cursor. .. Aunque esto es a menudo más lento que un cursor FORWARD_ONLY). Con SQL Server 2000 tuve algo que se ejecutó durante 1 hora antes de matarlo. Reescribí ese código en Perl y terminó en 20 minutos. Cuando un lenguaje de secuencias de comandos que es 20-80x más lento que C fuma SQL en rendimiento, definitivamente no tiene por qué escribir operaciones orientadas a filas en SQL.

Ahora SQL Server tiene integración CLR y muchos de estos problemas desaparecen si usa procedimientos almacenados CLR. Pero muchos DBA no saben cómo escribir programas .NET o apagar el CLR debido a problemas de seguridad y seguir con Transact SQL ... Además, incluso con los CLR, todavía tiene problemas para compartir datos entre múltiples procedimientos de manera eficiente .

También, en general, lo más difícil de escalar es la base de datos. Si toda su lógica empresarial está en la base de datos, cuando la base de datos se vuelva demasiado lenta, tendrá problemas. Si tiene una capa empresarial, puede agregar más almacenamiento en caché y más servidores empresariales para aumentar el rendimiento. Tradicionalmente, otro servidor para instalar Windows / Linux y ejecutar .NET / Java es mucho más barato que comprar otro servidor de base de datos y licenciar más SQL Server. Sin embargo, SQL Server ahora tiene más soporte de agrupación, originalmente no tenía ninguno. Entonces, si tiene mucho dinero, puede agregar clústeres o incluso hacer algunos envíos de registros para hacer múltiples copias de solo lectura. Pero en general, esto costará mucho más que solo tener una escritura detrás de la caché o algo así.

También mire las instalaciones de Transact-SQL. Manipulación de cuerdas? Tomaré las clases Java String Class / Tokenizer / Scanner / Regex cualquier día. Tablas hash / Listas vinculadas / Etc. Tomaré los marcos de Java Collection, etc ... Y lo mismo para .NET ... Tanto C # como Java son lenguajes mucho más evolucionados que Transact SQL ... La codificación de Heck con Transact-SQL me pone celoso de C ... .

Además, los procedimientos almacenados son más eficientes para trabajar con un gran conjunto de datos y aplicar múltiples consultas / criterios para reducirlo antes de devolverlo a la capa empresarial. Si tiene que enviar un conjunto de grandes conjuntos de datos a la aplicación del cliente y desglosar los datos en el cliente, será mucho más ineficiente que simplemente hacer todo el trabajo en el servidor.

También los procedimientos almacenados son buenos para la seguridad. Puede cortar todo el acceso a las tablas subyacentes y solo permitir el acceso a través de los procedimientos almacenados. Con algunas técnicas modernas como XML, puede tener procedimientos almacenados que realizan actualizaciones por lotes. Luego, todo el acceso se controla a través de los procedimientos almacenados, de modo que siempre que sean seguros / correctos, los datos pueden tener más integridad.

El argumento de inyección SQL ya no se aplica tanto, ya que tenemos consultas parametrizadas en el lado del lenguaje de programación. También, incluso antes de las consultas parametrizadas, un poco de reemplazo ("'", "' '") funcionó la mayor parte del tiempo también (aunque todavía hay trucos para usar para pasar el final de la cadena para obtener lo que desea).

En general, creo que SQL y Transact SQL son excelentes lenguajes para consultar / actualizar datos. Pero para codificar cualquier tipo de lógica, manipular cadenas (o manipular archivos ... te sorprendería lo que puedes hacer con xp_cmdshell ...), por favor no. Espero encontrar un lugar futuro que no utilice principalmente procedimientos almacenados. Desde el punto de vista del mantenimiento del código, son una pesadilla. Además, qué sucede si desea cambiar de plataforma (aunque realmente si pagó por Oracle / DB2 / Sybase / Sql Server / etc., también podría obtener todo lo que pueda de ellos utilizando todas las extensiones propietarias que pueda que lo ayuden. ..).

También sorprendentemente a menudo la lógica de negocios no es la misma. En el mundo ideal, pondría toda la lógica en los procedimientos almacenados y la compartiría entre aplicaciones. Pero a menudo la lógica difiere según las aplicaciones y sus procedimientos almacenados terminan convirtiéndose en monolitos demasiado complejos que las personas tienen miedo de cambiar y no comprenden todas las implicaciones. Mientras que con un buen lenguaje orientado a objetos puede codificar una capa de acceso a datos que tiene algunas interfaces / ganchos estándar que cada aplicación puede anular según sus propias necesidades.


66
Sin embargo, no puedo evitar ofrecer ideas para reflexionar sobre todo el tema orientado al conjunto versus el procedimiento. He visto cursores de bases de datos utilizados en todo tipo de casos en los que ese enfoque era una locura. He reemplazado personalmente el SQL explícito basado en el cursor (Oracle PL / SQL, en ese caso particular) con una consulta orientada a conjuntos y vi que los resultados regresaron en menos de un segundo, en lugar de 8 minutos. Me tomó 30 minutos diseccionar ese código de cursor de 1,000 líneas y "obtenerlo". La consulta SQL resultante fue concisa, elegante, simple. La gente subestima el poder de sus servidores de bases de datos con demasiada frecuencia y con demasiada rapidez.
Craig

12

¿Cómo versionan los procedimientos almacenados en el servidor?

Si vuelve a implementar procedimientos almacenados en el servidor desde el control de versiones, elimina el plan de ejecución almacenado.

Los procedimientos almacenados no deben modificarse directamente en el servidor, de lo contrario, ¿cómo sabe qué está funcionando realmente _ ahora mismo? Si no lo están, la herramienta de implementación necesita acceso para escribir procedimientos almacenados en la base de datos. Tendría que implementar en cada compilación (el plan ejecutivo podría ser diferente)

Si bien los procedimientos almacenados no son portables, tampoco lo es SQL en general (manejo de fecha de oráculo visto alguna vez - uggghhh).

Entonces, si desea portabilidad, cree una API interna de acceso a datos. Puede llamar a esto como llamadas de función, e internamente puede incorporar la jerga que desee, con consultas parametrizadas, y puede controlarse según la versión.


66
¿Cómo versionan los procedimientos almacenados en el servidor? - su versión controla el código fuente del proc de la tienda. Cuando llega el momento de la implementación, toma los procs de la tienda (desde una línea de base determinada) y usted (o su dba) se implementan en producción. La redistribución (ya sea en pruebas o en producción) ciertamente elimina el plan de ejecución almacenado, pero eso sucederá independientemente de si controlas o no tus SP.
luis.espinal

1
@BarryBrown No funciona si las personas tienen acceso al servidor directamente y pueden cambiar los procedimientos almacenados. Tendría que tener un proceso que vigila los SP, o tener un cheque antes de cada uso ...
Christopher Mahan

2
Si hay personas que simplemente cambian los sprocs de forma involuntaria en los servidores sin comprometer sus cambios al control de código fuente, tiene un problema de proceso que casi seguramente también afecta el desarrollo imperativo de su código, incluso si no es consciente de ello.
Craig

1
Una de las cosas que he hecho en el pasado ha sido colocar una instancia de desarrollo del servidor de bases de datos en estaciones de trabajo de desarrolladores individuales, o si eso no fuera posible, al menos tener instancias de "desarrollo" y "producción" de las bases de datos. , y todos los scripts DDL y DML, así como datos de muestra y scripts de carga vivían bajo su propio directorio en el árbol de origen, y la base de datos se construyó rutinariamente a partir de esos scripts utilizando el archivo MAKE. Los desarrolladores también pudieron usar nmake para construir procesos almacenados individuales. Si no lo pusieran bajo control de la fuente, desaparecería en ellos, y lo sabían.
Craig

1
... No quise sonar despectivo en mi comentario anterior, con la frase "..., incluso si no eres consciente ...". Lo que quería decir era que si ese tipo de cosas están sucediendo con los procedimientos almacenados, probablemente también ocurran en otras partes del proyecto. Personalmente, no me gusta el control de fuente integrado en IDE, en parte porque creo que hace que las personas sean un poco flojas en términos de pensar en lo que realmente significa para el equipo y el proyecto en su conjunto hacer cambios y comprometer esos cambios en el control de fuente repositorio. Esas cosas no deberían ser "automáticas" en mi opinión.
Craig

9

Esto es muy contrario a todo lo que he aprendido.

Es posible que necesite salir más. [sonríe] En serio, los procesos almacenados han estado en declive durante al menos 10 años. Casi desde que n-tier reemplazó cliente-servidor. La disminución solo se aceleró con la adopción de lenguajes OO como Java, C #, Python, etc.

Eso no quiere decir que los procedimientos almacenados aún no tengan sus defensores y defensores, pero esta es una discusión y debate de larga duración. No es nuevo, y probablemente continuará durante bastante tiempo; En mi opinión, los oponentes de los procesos almacenados están claramente ganando.

Los procedimientos almacenados le permiten reutilizar el código y encapsular (dos pilares del desarrollo de software)

Muy cierto. Pero, también lo hace una capa OO de arquitectura decente.

seguridad (puede otorgar / revocar permisos en un proceso almacenado individual)

Si bien puede hacerlo, pocos lo hacen debido a las graves limitaciones. La seguridad en el nivel de base de datos no es lo suficientemente granular como para tomar decisiones sensibles al contexto. Debido a la sobrecarga de rendimiento y administración, es inusual tener conexiones por usuario también, por lo que aún necesita cierto nivel de autorización en el código de su aplicación. Puede usar inicios de sesión basados ​​en roles, pero necesitará crearlos para nuevos roles, mantener el rol que está ejecutando, cambiar las conexiones para hacer un trabajo de "nivel de sistema" como el registro, etc. Y, al final, si su aplicación es propiedad, también lo es su conexión a la base de datos.

protegerlo de ataques de inyección SQL

No más que hacer consultas parametrizadas. Que se necesita para hacer de todos modos.

y también ayuda con la velocidad (aunque ese DBA dijo que a partir de SQL Server 2008 que incluso las consultas SQL regulares se compilan si se ejecutan suficientes veces).

Creo que eso comenzó en MSSQL 7 o 2000. Ha habido muchos debates, mediciones y desinformación sobre el proceso almacenado vs el rendimiento de SQL en línea: lo agrupo todo bajo YAGNI. Y, si lo necesita, pruebe.

Estamos desarrollando una aplicación compleja utilizando la metodología de desarrollo de software ágil. ¿Alguien puede pensar en buenas razones por las que no desearían usar procedimientos almacenados?

No puedo pensar en muchas razones por las que querrías hacerlo. Java / C # / cualquier lenguaje 3rd GL son mucho más capaces que T-SQL en encapsulación, reutilización y felxibilidad, etc. La mayoría de los cuales es gratis dado un ORM medio decente.

Además, dado el consejo de "distribuir según sea necesario, pero no más", creo que la carga de la prueba en estos días recae en los defensores de SP. Una razón común para que el proceso almacenado sea pesado es que T-SQL es más fácil que OO, y la tienda tiene mejores desarrolladores de T-SQL que OO. O bien, que el DBA se detiene en la capa de la base de datos y que los procesos almacenados son la interfaz entre dev y DBA. O bien, está enviando un producto semi-personalizado y los procesos almacenados pueden ser personalizados por el usuario. En ausencia de algunas consideraciones como esa, creo que el valor predeterminado para cualquier proyecto Agile SW en estos días será ORM.


1
Hay MUCHO para ganar rendimiento si no tiene que transferir conjuntos de datos gigantescos de la base de datos para hacer cosas simples. Mida y optimice si es necesario.

Precisamente. Los procedimientos almacenados se pueden usar como un bisturí. Es una garantía absoluta de que la E / S dentro del servidor de la base de datos tiene más ancho de banda que la E / S entre el servidor de la base de datos y su nivel medio. Y no va a escribir un código de unión de datos más rápido y eficiente en su nivel medio que los desarrolladores del motor de la base de datos escribieron en el servidor de la base de datos. Si está transfiriendo 1,000,000 de filas de datos a su nivel medio para hacer una unión, lo cual ciertamente he visto, simplemente debería ser azotado ... Es como los tipos que afirman que debería "escribir su propio código de reversión". Locura.
Craig

1
No subestimes tu servidor de base de datos. Aprende a usarlo correctamente.
Craig

1
FWIW, no necesita un proceso almacenado para hacer una unión en el lado de la base de datos. Y si está utilizando un cursor para la lógica de procedimiento, es probable que ya haya perdido la guerra del rendimiento. Renunciar a los procedimientos almacenados ciertamente no es lo mismo que renunciar a SQL o establecer soluciones basadas.
Mark Brackett

1
Totalmente cierto, y en realidad estaba argumentando a favor de SQL más que argumentando específicamente para sprocs. Pero tener SQL incrustado en su código imperativo tampoco es necesariamente la clave de la felicidad, ¿verdad? Lo que a menudo conduce a todo el debate de ORM, lo que luego me lleva a señalar comparaciones de rendimiento entre el acceso db impulsado por ORM frente a simplemente aprender a usar SQL. He visto y oído hablar de sistemas en los que, por ejemplo, los consultores de Oracle recomendaron mantener toda la carga posible fuera del servidor de la base de datos, lo que lleva a un middleware pesado (¡y extremadamente caro!) Con un rendimiento abismal .
Craig

4

Teniendo en cuenta todos los casos anteriores, me gustaría agregar uno más. La elección de SP puede depender también de la elección de las personas.

Personalmente, me siento frustrado cuando la gente pone una lógica muy compleja en SP y creo que dicho SP es muy complejo de mantener y depurar. Incluso en muchos casos, el propio desarrollador enfrenta problemas cuando la depuración del código subyacente (por ejemplo, parte del lenguaje) es mucho más fácil que en SP.

SP solo debe usarse para operaciones simples. Bueno, esa es mi elección.


4

Quiero cubrir algunos problemas a favor y en contra con los procs almacenados. Los usamos ampliamente con LedgerSMB , y nuestra regla es, con algunas extensiones muy específicas, "si se trata de una consulta, conviértala en un proceso almacenado".

Nuestra razón para hacerlo fue facilitar la reutilización de consultas en varios idiomas. No hay una mejor manera de hacerlo honestamente.

Al final, la pregunta siempre está en los detalles. Los procedimientos bien utilizados y almacenados hacen las cosas mucho más fáciles, y mal utilizados hacen las cosas mucho más difíciles.

Así que por el lado de la estafa.

  1. Como se usa tradicionalmente, los procedimientos almacenados son frágiles. Utilizados solos, crean la posibilidad de agregar errores a su código en lugares que no esperaba por ninguna otra razón que la sintaxis de la llamada cambió. Usado solo, esto es un pequeño problema. Hay demasiada cohesión entre las capas y esto causa problemas.

  2. Sí, es posible tener una inyección sql intra-sproc si se hace un sql dinámico. Es malo confiar demasiado en esta área y, en consecuencia, uno debe tener una experiencia significativa en seguridad en esta área.

  3. Los cambios en las interfaces son algo problemáticos con los procedimientos almacenados por la razón # 1 anterior, pero esto puede convertirse en una gran pesadilla si hay un gran número de aplicaciones cliente involucradas.

Lo anterior es bastante difícil de negar. Ellos pasan. Todos, pro-SP y anti-SP probablemente han tenido historias de terror con respecto a estos. Los problemas no son irresolubles, pero si no les presta atención, no puede resolverlos (en LedgerSMB usamos un localizador de servicios para generar dinámicamente llamadas SP en tiempo de ejecución, evitando los problemas anteriores por completo. Si bien somos PostgreSQL solo, algo similar podría hacerse para otros db's).

En lo positivo. Suponiendo que puede resolver los problemas anteriores, obtiene:

  1. La posibilidad de mayor claridad en las operaciones de configuración. Esto es particularmente cierto si su consulta es muy grande o muy flexible. Esto también conduce a una capacidad de prueba mejorada.

  2. Si ya tengo un localizador de servicios trabajando en esta área, encuentro que los procedimientos almacenados aceleran el ritmo de desarrollo porque liberan al desarrollador de la aplicación de las preocupaciones de db y viceversa. Esto tiene algunas dificultades para hacer lo correcto, pero no es tan difícil de hacer.

  3. Consulta de reutilización.

Ah, y algunas cosas que casi nunca debes hacer en un SP:

  1. lógica no transaccional. Envió el correo electrónico indicando que se envió el pedido pero la transacción se retiró ... o ahora está esperando continuar para que el servidor de correo electrónico se conecte ... o, peor aún, revierta su transacción solo porque no puede comunicarse con el servidor de correo electrónico ...

  2. muchas pequeñas consultas unidas libremente, salpicadas de lógica de procedimiento ...


De acuerdo, re: mantener la basura no transaccional fuera de los procedimientos almacenados. En ese ejemplo de correo electrónico, el mensaje de correo electrónico debe colocarse en una cola y recibir servicio de forma asíncrona, de todos modos. ¿Habla de prepararse para un éxito de rendimiento masivo y un comportamiento funky bajo carga, haciendo que las transacciones de su base de datos dependan de la respuesta de su servidor de correo? ¡Ay!
Craig

3

¿Para quién trabajas?

La respuesta puede depender de con quién está empleado, la empresa de consultoría o la propia empresa. Lo que es mejor para una empresa a menudo no es lo mejor para una empresa consultora u otro proveedor de software. por ejemplo, una empresa inteligente desea tener una ventaja permanente sobre sus competidores Por el contrario, un proveedor de software quiere poder ofrecer la misma solución a todas las empresas en una industria en particular, por el costo más bajo. Si tienen éxito en esto, no habrá una ventaja competitiva neta para el cliente.

En este caso particular, las aplicaciones van y vienen, pero muy a menudo, la base de datos corporativa vive para siempre. Una de las cosas principales que hace un RDBMS es evitar que los datos basura ingresen a la base de datos. Esto puede involucrar procedimientos almacenados. Si la lógica es buena lógica y es muy poco probable que cambie de año en año, ¿por qué no debería estar en la base de datos, manteniéndola internamente consistente, independientemente de la aplicación que se escriba para usar la base de datos? Años más tarde, alguien tendrá una pregunta que quiera hacerle a la base de datos y responderá si se ha impedido que la basura ingrese a la base de datos.

Entonces, tal vez esto tenga algo que ver con el hecho de que su DBA trabaja para una empresa de consultoría. Cuanto más portátiles puedan hacer su código, más podrán reutilizar el código de cliente a cliente. Cuanto más lógica puedan vincular en su aplicación, más se unirá la empresa al proveedor. Si dejan un gran desorden en el proceso, se les pagará por limpiarlo o nunca volverán a ver el desorden. De cualquier manera, es una victoria para ellos.

ingrese la descripción de la imagen aquí

Para (mucha) más discusión en ambos lados de la cerca, lea la discusión sobre codificación del horror . FWIW Me inclino al lado de aquellos que abogan por los SP.


1
Esta respuesta se centra en vincular la pregunta de si usar o no los procedimientos almacenados con la pregunta para quién trabaja y cuáles son sus motivaciones. Voto a favor. En cambio, la respuesta debería centrarse en vincular la pregunta de si usar o no los procedimientos almacenados los pros y los contras de los procedimientos almacenados. Si la respuesta se enfocara en la idea de que los SP evitan que la basura ingrese a la base de datos, no habría votado negativamente. No estaría de acuerdo, en aras de la divulgación, pero no habría votado negativamente.
yfeldblum

También vinculó un artículo de 2004, en mi humilde opinión, el panorama ha cambiado bastante desde entonces. Los OR / M se han vuelto mucho más comunes. Ruby / Rails ActiveRecord, MS salió con linq & EF, Django para python, etc.
Brook

@Justice, tiene razón, sin embargo, si las mejores prácticas del área de programas almacenados dependen mucho de quién es la empresa y qué papel juegan. Por ejemplo, los procesos almacenados le permiten establecer permisos en el proceso en sí y no directamente en la tabla. Si está haciendo algún trabajo financiero y tiene que considerar los controles internos, son la única opción viable para proteger sus datos de los usuarios. Pero si está creando productos COTS con posibles backends múltiples, son demasiado específicos de la base de datos. Si es una empresa de consultoría, es posible que deba considerar varios enfoques diferentes como los mejores para las circunstancias.
HLGEM

3
@HLGEM No me opongo a ninguno de los puntos que mencionaste . Pero me opongo a la tesis de la respuesta de que la razón principal por la que el DBA podría poner lógica en la aplicación es porque es un consultor y tiene la intención de atornillar al cliente. Vincula la posición moral de una persona a su elección de usar procedimientos almacenados. En mi opinión, hay argumentos técnicos en ambos lados, y los argumentos en ambos lados diferirán de una aplicación a otra, de una tecnología a otra, de una compañía a otra, de una industria a otra. Y primero buscaré mérito antes de impugnar el motivo.
yfeldblum

Dijo que trabaja para una empresa de consultoría. Mantener un mayor control sobre el código frente a los procedimientos almacenados que se implementan en el sitio del cliente es una razón muy legítima por la que esta podría ser su "mejor práctica". Puede que no sea para "atornillar al cliente", pero podría ser un problema de mayor control.
Jesse

3

Es muy difícil cambiar las marcas de la base de datos y utilizar los mismos procedimientos almacenados.

Su equipo tampoco tiene un DBA y nadie más quiere tener nada que ver con sql.

Esto no es más que un concurso de meado programador v DBA.


2

OMI depende. Los procedimientos almacenados tienen su lugar, pero no son una mejor práctica, ni tampoco deben evitarse a toda costa. Un desarrollador inteligente sabe cómo evaluar adecuadamente una situación dada y determinar si un procedimiento almacenado es la respuesta. Personalmente, soy fanático de usar un ORM de algún tipo (incluso uno básico como Linq a SQL sin procesar) en lugar de procedimientos almacenados, excepto tal vez para informes predefinidos o similares, pero de nuevo es realmente una base de caso por caso.


Los votantes negativos deberán comentar.
SandRock

2

Siempre es una fuente de problemas tener la lógica de negocios dividida entre diferentes capas, usando diferentes lenguajes de programación. Rastrear un error o implementar un cambio es mucho más difícil cuando tienes que cambiar entre mundos.

Dicho esto, conozco compañías que funcionan bastante bien al poner toda la lógica de negocios en paquetes PL / SQL que viven en la base de datos. Esas no son aplicaciones muy grandes, pero tampoco triviales; decir 20K-100K LOC. (PL / SQL es más adecuado para ese tipo de sistema que T-SQL, por lo que si solo conoce T-SQL, probablemente sacuda la cabeza con incredulidad ahora ...)


2

Este es otro punto aún no mencionado:

Las herramientas de generación de código y las herramientas de ingeniería inversa realmente no pueden hacer frente a los procedimientos almacenados. La herramienta generalmente no puede decir qué hace el proceso. ¿El proceso devuelve un conjunto de resultados? Varios conjuntos de resultados? ¿Obtiene sus conjuntos de resultados de varias tablas y tablas temporales? ¿Es el proceso solo una declaración de actualización encapsulada y no devuelve nada? ¿Devuelve un conjunto de resultados, un valor de retorno y alguna "salida de consola"?

Por lo tanto, si desea utilizar una herramienta para crear una capa DTO y DAO de objetos de transferencia de datos automáticamente (como lo hace el "creador de servicios" de liferay), no puede hacerlo fácilmente.

Además, los ORM como Hibernate realmente no pueden funcionar correctamente cuando la fuente de datos es un SP. El acceso a datos es de solo lectura en el mejor de los casos.


Es interesante que las herramientas de generación de código aparentemente tengan dificultades para determinar si un procedimiento almacenado devuelve un conjunto de resultados, cuando el procedimiento almacenado en sí no tiene ningún problema con eso.
Craig

2

Programando solo, no puedo resistirme a escribir procedimientos almacenados.

Estoy usando MySQL principalmente. No he usado bases de datos orientadas a objetos antes como PostGreSQL, pero lo que puedo hacer con los SP en MySQL es abstraer un poco la estructura de la tabla. SP a permitir que diseñe estas acciones primitivas, cuyas entradas y salidas no va a cambiar , incluso si la base de datos por debajo de ella no cambia.

Entonces, tengo un procedimiento llamado logIn. Cuando inicia sesión, siempre pasa usernamey password. El resultado devuelto es el entero userId.

Cuando se logIntrata de un procedimiento almacenado, ahora puedo agregar trabajo adicional para realizar al iniciar sesión que ocurre al mismo tiempo que el inicio de sesión inicial. Encuentro una serie de instrucciones SQL con lógica incorporada en un procedimiento almacenado más fácil de escribir que ( Entorno FETCH) -> (obtener resultado) -> (llamando al entorno FETCH) serie que tienes que hacer cuando escribes el lado del servidor lógico.


1

También quiero señalar que los procedimientos almacenados usan tiempo de CPU en el servidor. No mucho, pero algo. Parte del trabajo realizado en el procedimiento de trabajo podría realizarse en la aplicación. Es más fácil escalar la capa de la aplicación que la capa de datos.


3
¿Es difícil escalar una base de datos?
JeffO

1
Es al menos significativamente más costoso (a menos que esté en MySQL) y en muchos lugares en los que he trabajado obtener otra licencia de SQL Server Enterprise Edition es como tirar los dientes
ben f.

escalar la base de datos no es más difícil que escalar una capa de aplicación al final de la historia
Brian Ogden

1

Estoy de acuerdo con Mark en que la comunidad realmente se ha alejado de los procedimientos almacenados durante bastante tiempo. Si bien muchos de los puntos que el póster original planteó por qué podríamos querer usar SP fueron válidos en algún momento, ha pasado bastante tiempo y, como dijo otro póster, el entorno ha cambiado. Por ejemplo, recuerdo que un argumento PARA usar los SP 'en el día' fue el aumento de rendimiento logrado porque sus planes de ejecución fueron 'precompilados' mientras que el SQL dinámico de nuestro código tuvo que 'volver a compilarse' con cada ejecución. Este ya no es el caso, ya que las principales bases de datos han cambiado, mejorado, adaptado, etc.

Dicho esto, estamos usando SP en mi proyecto actual. La razón es simplemente porque estamos creando nuevas aplicaciones sobre una base de datos existente que aún admite aplicaciones heredadas. Como resultado, hacer cambios de esquema es muy difícil hasta que apaguemos las aplicaciones heredadas. Tomamos una decisión consciente de diseñar nuestras nuevas aplicaciones basadas en el comportamiento y las reglas requeridas para la aplicación y usar los SP para interactuar temporalmente con la base de datos de la manera que nos gustaría que fuera y permitir que los SP se adapten al SQL existente . Esto va al punto de un póster anterior de que los SP facilitan hacer cambios a nivel de la base de datos sin requerir cambios en el código de la aplicación. Usar SP como una implementación del patrón Adaptador ciertamente tiene sentido para mí (especialmente dado mi proyecto actual),

Fwiw, nuestra intención es eliminar los SP cuando se actualiza el esquema. Pero, como con todo lo demás en el desarrollo corporativo, ¡veremos si eso sucede alguna vez! [mueca]


0

Solo quería hacer una descripción concisa de cómo recomendaría usar procedimientos almacenados. No creo que sean una mala práctica en absoluto, y como otros han dicho, deberían usarse en las situaciones adecuadas.

Puedo ver problemas en los que escribir procedimientos para diferentes aplicaciones puede volverse confuso en funcionalidad y separar la lógica de negocios de la aplicación y hacer que la base de datos se vuelva más desorganizada y restrictiva también.

Por lo tanto, usaría un procedimiento almacenado en tareas orientadas a datos relacionales específicas de la base de datos. En otras palabras, si hay una lógica utilizada para las operaciones de la base de datos que es consistente con los datos de cualquier aplicación, se podría usar un procedimiento almacenado para mantener los datos almacenados de manera consistente (tiene sentido). Creo que buenos ejemplos de esto son: registro consistente, mantenimiento consistente, trabajar con información confidencial, etc.

Creo que otras tareas que manipulan los datos para ajustarse a las necesidades de la aplicación que siguen el sólido modelo de datos de la base de datos deberían almacenarse en otra capa que contenga la lógica empresarial. En resumen, la manipulación de datos específicos de la base de datos para la coherencia podría usar procedimientos almacenados, donde la coherencia se extiende más allá del modelo de esquema de integridad de la base de datos.


-1

Los procedimientos almacenados "para mí" son adecuados para operaciones OLAP de "solo lectura", de uso poco frecuente.

Para las reglas comerciales, las operaciones de lectura / escritura OLTP prefiero los servidores de aplicaciones Java. Para facilitar la codificación y, en la medida de lo posible, aliviar la carga de CPU y memoria de los servidores db maestros. En esta configuración, todo el código en los servidores de aplicaciones no es difícil de revisar o registrar y es escalable.

Lo importante para mí es que es más fácil depurar en la capa empresarial que depurar procedimientos almacenados.


Hizo algunas suposiciones: que el OP necesita OLAP (no se menciona en la pregunta); que la plataforma utilizada tiene servidores de aplicaciones Java (poco probable ya que la etiqueta se trata de SQL Server). Su respuesta tampoco aporta nada que las otras 22 respuestas no cubrieran ya
Adam Zuckerman

Solo decía que si empiezo un nuevo proyecto, raramente usaré el procedimiento almacenado para operaciones de solo lectura, solo una elección personal. Me parece más conveniente hacer la mayoría de las codificaciones en la capa de lógica de negocios en lugar de la capa de datos.
jaizon lubaton

esto no parece ofrecer nada sustancial sobre los puntos realizados y explicados en anteriores 24 respuestas, casi no vale la pena un contenido chocar un niño de 4 años de edad pregunta
mosquito

-2

Además de distribuir la lógica de negocios innecesariamente y de vincularlo con un proveedor de base de datos específico, también creo firmemente en el uso de una tecnología para lo que estaba destinado. Una base de datos es solo eso, un almacén de datos relacionales. Úselo para almacenar datos, nada más.

Elija sus herramientas sabiamente y se ahorrará un mundo de dolor a largo plazo.


si vas a votar en contra, entonces hazlo, pero al menos explica por qué.
Nico

probablemente porque te equivocas. Un SP no significa que está escribiendo código allí, solo escribe sus consultas de acceso a datos (en el 99% de los casos, creo). Además, solo poner disparadores y restricciones en el modelo de datos cuenta como 'código', es decir, lógica operativa, no datos. De ahí mi punto de que te equivocas.
gbjbaanb

¿Dónde establece transformaciones en sus datos almacenados que no sean en la base de datos?
Chris Travers
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.