¿Por qué desea evitar el SQL dinámico en el procedimiento almacenado?

13

Escuché que uno dijo que no desea utilizar Dynamic SQL. ¿Puedes dar algún ejemplo concreto o un ejemplo de la vida real? Personalmente, lo codifico algunas veces en mi base de datos. Creo que está bien porque es flexibilidad. Mi suposición es acerca de la inyección o el rendimiento de SQL. ¿Algo más?

Richard Sayakanit
fuente

Respuestas:

7

No hay nada de malo en usar SQL dinámico si es necesario. De hecho, en algunas circunstancias es la única opción que tiene. Es más recomendable no usarlo, ya que sí, puede conducir a una inyección de SQL si su entrada no se desinfecta, y sí, usar SQL dinámico en los módulos que se llaman a menudo puede ser perjudicial para su rendimiento.

No creo que haya un ejemplo concreto en sí mismo, pero diría esto: intente lograr lo que es después de usar consultas y declaraciones regulares primero, solo luego de que haya agotado todas las demás vías, hágalo dinámicamente. Solo recuerde que la ejecución de una cadena dinámica de SQL se realiza en una sesión de usuario separada para el módulo que lo está llamando, por lo que puede encontrar problemas de permisos donde no espera ninguno.

Si te preocupa el rendimiento; Pruébalo. Si te preocupa la seguridad; validar su entrada. No hay correcto o incorrecto, solo que use su mejor criterio en función de la información y las herramientas que tenga disponibles en ese momento.

Mr.Brownstone
fuente
5

Dynamic SQL es una herramienta. Y como herramienta, tiene algunas aplicaciones; por ejemplo, para trabajos administrativos es una bendición.

No es tan bueno en el SP utilizado por las aplicaciones, especialmente si no administró la parametrización del código generado (las últimas versiones de SQL Server redujeron los problemas, pero aún son válidos).

No entraré en detalles aquí, por lo que recomendaré un excelente artículo sobre cuestiones de SQL dinámico: La maldición y las bendiciones de SQL dinámico por MVP Erland Sommarskog.

Fabricio Araujo
fuente
1
También iba a compartir ese enlace, es una lectura obligatoria para cualquiera que esté considerando usar SQL dinámico.
HLGEM
1

Es como la mayoría de las funciones de dbms, si lo usa en la situación correcta, funciona bien, la situación incorrecta lo hace mal.

Pros: Algunas cosas simplemente no se pueden hacer sin ella. Por lo general, solo he encontrado que esto es para el trabajo administrativo, y no para el código de la aplicación. Algunos comandos del sistema no permiten que los parámetros se utilicen como entrada. Entonces, por ejemplo, si necesito ejecutar algo a través de un sproc en cada base de datos, en muchas instancias con bases de datos desconocidas, y el comando no acepta parámetros, generalmente lo resuelvo a través de SQL dinámico. Sin embargo, esto es más importante en Sybase ASE que en MSSQL.

Contras: no voy a entrar mucho en eso, ya que creo que todos ya lo sabemos, pero puede haber algún riesgo para la inyección de SQL si se usa incorrectamente. El más grande para mí es que la consulta se tratará como lo que es, una consulta ad hoc única y no formará parte del plan de consulta compilado. Para algo que se ejecuta ocasionalmente, no es gran cosa. Para algo que se ejecuta cientos de veces por minuto y que va a tener una gran cantidad de sql únicos, generaría muchos planes de consulta nuevos y potencialmente innecesarios, consumiendo ciclos y acortando el tiempo válido del caché del plan.

DBAmazinglyBadAtThis
fuente
Un uso excelente de la aplicación en Sybase ASE son los pivotes sin conocer los valores que se van a pivotar. Esto se puede hacer usando SQL dinámico en un proceso almacenado, pero que yo sepa, Sybase ASE no admite la sintaxis para hacer esto directamente como una consulta. Solo una vez que se conocen los valores, se puede escribir la consulta para pivotar los datos.
richardcrossley
-7

No use SQL dinámico.

El 99% del tiempo se usa Dynamic SQL debido a la falta de conocimiento sobre cómo usar parámetros opcionales en procedimientos almacenados, el resto el 1% del tiempo se usa para crear una consulta altamente compleja para un informe que el cliente no comprende incluso. The Curse and Blessings of Dynamic SQL no muestra un ejemplo de por qué sería una buena idea usarlo, solo sugiere que es problemático porque aumenta la complejidad de la depuración, el mantenimiento, sin mencionar los riesgos de seguridad de SQL Inyección, bajo rendimiento no porque el caché sino las malas prácticas que conlleva, como el uso de tablas y cursores temporales que, por supuesto, son flojos e ingenuos.programador abusaría de. No existe la flexibilidad para escribir consultas de esa manera, SQL es un lenguaje declarativo y debe tratarse como tal.

La pereza es la raíz de todo mal.

Paradójicamente, esta respuesta se clasificará entre las más rechazadas .

Ivanzinho
fuente
El artículo, de hecho, ofrece al menos un ejemplo de un caso de uso ideal para SQL dinámico y "no existe tal cosa como la flexibilidad para escribir consultas de esa manera ..." no es cierto: el SQL dinámico es exactamente lo que permite esto flexibilidad.
LowlyDBA
Parámetros opcionales? ¿Te refieres al antipatrón?
Forrest
@LowlyDBA El artículo ofrece al menos un ejemplo: el SELECT más simple que se haya visto, ¿qué problema complejo está resolviendo? y por la flexibilidad, sí, para esos programadores ingenuos.
Ivanzinho
@Forrest ¿por qué lo llamas "antipatrón"? porque el enlace que proporcionó nunca dice eso, y tampoco muestra cuánta mejora se realizó después de que la lógica se reescribiera en un SQL dinámico (que en este caso sería insignificante en comparación con el efecto bola de nieve de mantener esa consulta)
Ivanzinho
Esta es una respuesta (pobre) basada en la opinión en mi humilde opinión. No ha proporcionado ejemplos concretos de los problemas que describe, ni ha definido los profesionales del uso de SQL dinámico
George.Palacios