sistema notificaciones from detectar datos cambios c# sql sql-server stored-procedures

notificaciones - fill combobox c# from database



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

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).


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

Siempre parametrice todas las consultas; nunca incluya información de la entrada del usuario y estará bien.

Eso va por sprocs y dinámica sql.

No estoy seguro de que no recompilar tu aplicación sea una ventaja. Quiero decir, has ejecutado tus pruebas de unidad contra ese código (tanto la aplicación como la base de datos) antes de volver a funcionar de todos modos.

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

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

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

Las inyecciones de Sql aún se pueden realizar contra esos sprocs si son dinámicamente en línea, por lo que la regla de oro todavía se aplica, todas las entradas del usuario siempre deben estar parametrizadas.


Algo que no he visto mencionado hasta ahora: las personas que mejor conocen la base de datos no siempre son las personas que escriben el código de la aplicación. Los procedimientos almacenados brindan a la gente de 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.

Cuando se trata de seguridad, los procedimientos almacenados son mucho más seguros. Algunos han argumentado que todo el acceso será a través de la aplicación de todos modos. Lo que muchas personas están olvidando es que la mayoría de las brechas de seguridad provienen de una empresa. Piense en cuántos desarrolladores conocen el nombre de usuario y la contraseña "ocultos" para su aplicación?

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

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

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

El único inconveniente que veo es que muchos idiomas no permiten pasar parámetros de tabla, por lo que pasar valores de datos de números desconocidos puede ser molesto, y algunos idiomas aún no pueden manejar la recuperación de varios conjuntos de resultados de un solo procedimiento almacenado (aunque este último no hace que los SP sean peores que el SQL en línea a este respecto).


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.


En mi opinión, no puede votar si o no sobre esta pregunta. Depende totalmente del diseño de su aplicación.

Yo voto totalmente en contra del uso de SP en un entorno de 3 niveles, donde tiene un servidor de aplicaciones en frente. En este tipo de entorno, su servidor de aplicaciones está allí para ejecutar su lógica de negocios. Si además utiliza SP, comienza a distribuir su implementación de lógica de negocios en todo su sistema y quedará muy poco claro quién es responsable de qué. Finalmente, terminarás con un servidor de aplicaciones que básicamente no hará nada más que lo siguiente:

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

Así que al final, tienes tu nivel medio en ejecución en este genial clúster de 4 Servidores, cada uno de ellos equipado con 16 CPU, ¡y en realidad no hará nada! ¡Que desperdicio!

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


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


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

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


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

Los procedimientos almacenados son MÁS mantenibles porque:

  • No tienes que volver a compilar tu aplicación C # cuando quieras cambiar algo de SQL
  • Terminas reutilizando el código SQL.

¡La repetición de código es lo peor que puede hacer cuando intenta crear una aplicación que se pueda mantener!

¿Qué sucede cuando encuentra un error lógico que debe corregirse en varios lugares? Es más probable que olvide cambiar ese último lugar donde copia y pega su código.

En mi opinión, los beneficios de rendimiento y seguridad son una ventaja añadida. Todavía puede escribir procedimientos almacenados de SQL inseguros / ineficientes.

Más fácil de portar a otra base de datos - no hay procesos de puerto

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


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 fan de los procedimientos almacenados.

Los procedimientos almacenados son MÁS mantenibles porque: * No tiene que volver a compilar su aplicación C # cada vez que desee cambiar algo de SQL

Terminarás recompilándolo de todos modos cuando cambien los tipos de datos, o quieras devolver una columna extra, o lo que sea. El número de veces que puede ''transparente'' cambiar el SQL desde debajo de su aplicación es bastante pequeño en general

  • Terminas reutilizando el código SQL.

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

¡La repetición de código es lo peor que puede hacer cuando intenta crear una aplicación que se pueda mantener!

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

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

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

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

En este caso, es más fácil enviar un nuevo sproc, pero según mi experiencia, el 95% de los "cambios impulsados" afectan el código y no la base de datos. Si está enviando 20 elementos a los servidores web ese mes y 1 a la base de datos, difícilmente perderá mucho si, por el contrario, empuja 21 elementos a los servidores web y cero a la base de datos.

Código más fácilmente revisado.

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

Más contras:

Storedprocs vive en la base de datos, que aparece ante el mundo exterior como una caja negra. Cosas simples como querer ponerlas en control de fuente se convierten en una pesadilla.

También está el tema del puro esfuerzo. Podría tener sentido dividir todo en un millón de niveles si está tratando de justificar ante su CEO por qué solo les cuesta 7 millones de dólares construir algunos foros, pero de lo contrario, crear un proceso almacenado para cada pequeña cosa es un trabajo extra de burro para no hacer nada. beneficio.


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


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

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


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.


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


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.


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

Hay una


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.


Ventajas para procedimientos almacenados :

Código más fácilmente revisado.

Menos acoplado, por lo tanto más fácilmente probado.

Más fácilmente sintonizado.

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

Puede proteger el acceso a los datos con mayor facilidad, eliminar el acceso directo a las tablas, imponer la seguridad a través de los procesos; esto también le permite encontrar con relativa rapidez cualquier código que actualice una tabla.

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

Desventajas:

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