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.