c# - sqlquery - mapear stored procedure entity framework
¿Por qué necesito procedimientos almacenados cuando tengo LINQ to SQL? (18)
Mi comprensión de Linq a Sql es que tomará mi declaración Linq y la convertirá en una declaración SQL equivalente.
Asi que
var products = from p in db.Products
where p.Category.CategoryName == "Beverages"
select p
Solo se convierte en
Select * from Products where CategoryName = ''Beverages''
Si ese es el caso, no veo cómo los procedimientos almacenados ya son útiles.
Los procedimientos almacenados y Linq to Sql resuelven diferentes problemas.
Linq to Sql es particular de Microsoft SQL Server.
Ah, el tema de muchos debates.
Muchos argumentarían en estos días que las tecnologías tales como LINQ-to-SQL generan tan buenos SQL actualmente que las ventajas de rendimiento son marginales. Personalmente, prefiero que los expertos SQL ajusten el rendimiento de SQL, no los codificadores generales, por lo que tiendo a estar en desacuerdo.
Sin embargo, mi preferencia principal por los procedimientos almacenados tiene menos que ver con el rendimiento y más con la administración de seguridad y configuración.
Gran parte de mi trabajo arquitectónico se centra en soluciones orientadas a servicios y al tratar la base de datos como un servicio, es significativamente ayudado por el uso de procedimientos almacenados.
Principalmente, la limitación del acceso a la base de datos a través de procedimientos almacenados crea una interfaz bien definida, lo que limita el área de superficie de ataque y aumenta la capacidad de prueba. Permitir que las aplicaciones accedan directamente a los datos subyacentes aumenta en gran medida el área de superficie de ataque, reduciendo la seguridad y haciendo que el análisis de impacto sea extremadamente difícil.
Algunas cosas no se pueden hacer sin procedimientos almacenados. Por ejemplo, en mi trabajo anterior, había un procedimiento almacenado que devolvía el valor actual de una fila, y lo incrementaba en la misma operación atómica, de manera que ninguno de los dos procesos obtenía el mismo valor. No recuerdo por qué se hizo esto en lugar de usar el autoincremento, pero había una razón para ello.
Ciertamente no "necesita" procedimientos almacenados. Pero pueden ser útiles si su modelo de dominio requiere una Entidad agregada compleja y no tiene el lujo / la flexibilidad para modificar las tablas de su base de datos para que se ajusten a su modelo de dominio. En este caso, el uso de Linq-to-SQL u otro ORM puede dar como resultado un conjunto de llamadas a la base de datos de muy mal rendimiento para construir su Entidad. Un proceso almacenado puede venir al rescate aquí.
Por supuesto, recomendaría usar una metodología o proceso como TDD / BDD que le brinde la flexibilidad de modificar las tablas de su base de datos según sea necesario sin mucho dolor. Esa es siempre la ruta más fácil y más fácil de mantener en mi opinión.
Ejemplo simple:
select * from Products where GetCategoryType(CategoryName)=1
GetCategoryType puede ejecutarse muy rápido, porque se ejecuta en el servidor de bases de datos. No hay sustituto de Linq a SQL para eso, hasta donde yo sé.
El soporte de procedimientos almacenados para LINQ to SQL se incluyó en parte para la compatibilidad con los sistemas existentes. Esto permite a los desarrolladores migrar de un sistema basado en sproc a un sistema totalmente basado en LINQ a lo largo del tiempo, sproc por sproc, en lugar de obligar a los desarrolladores a apresurarse para convertir todo un sistema a la vez.
Existen importantes mejoras de rendimiento asociadas en el lado de SQL Server si utiliza procedimientos almacenados en circunstancias apropiadas.
Los procedimientos almacenados son útiles en muchos casos, pero en general si está utilizando un ORM, debe dejar que el ORM genere el SQL por usted. ¿Por qué deberíamos tener que mantener como mínimo cuatro procedimientos almacenados (insertar eliminación de actualización y una única selección) para cada tabla?
Dicho esto, como señalaron las personas, existen beneficios de seguridad para el uso de procedimientos almacenados. No tendrá que otorgar a los usuarios lectura / escritura en las tablas, lo cual es una buena protección contra la Inyección SQL.
Los procedimientos almacenados también son útiles cuando la lógica utilizada para recuperar datos es bastante compleja. Típicamente verás esto más en Reporting Scenario''s y en ese caso probally no usarás Linq2Sql u otro ORM.
En mi opinión, si no está generando su SQL, sino que básicamente está codificándolo dentro de un nivel de aplicación, entonces debe refactorizarse en procedimientos almacenados, y sí, siempre hay excepciones a las reglas, pero en general.
Un uso de un procedimiento almacenado en Linq2Sql podría ser que si tiene varios servidores y está enlazando con ellos, podría usar un procedimiento almacenado para exponer datos de ese otro servidor y manipularlos. Esto ocultaría los múltiples servidores de tu aplicación.
Los sprocs son otra herramienta en la caja. Puede usar su elegante llave de ajuste automático para el 90% de sus tareas, pero no puede usar esa cosa brillante en nueces despojadas. Para eso, una buena llave inglesa es tu mejor amigo. A menos que rompas el perno, en cuyo caso estás atascado con el ensamblaje.
Los sprocs tienen sus usos, al igual que el uso de LINQ. OMI si una operación se realiza varias veces en varios lugares, entonces es un buen candidato para "refactorizar" en un proceso almacenado, a diferencia de una declaración LINQ que se repite en diferentes lugares.
Además, y esto es probablemente una blasfemia para mucha gente aquí, a veces debes poner algo de lógica en la base de datos y luego un sproc es útil. Es algo raro, pero a veces la naturaleza de las reglas comerciales lo exige.
Mucha gente ha estado pasando muy bien sin ellos desde hace un tiempo. Si puede hacer su trabajo de manera segura y eficiente sin ellos, no se sienta culpable por usar L2S puro. Estamos contentos de deshacernos de ellos en mi tienda.
Personalmente, no me importa LINQ. Me gusta una separación de las cosas de manipulación de datos y las cosas de código. Además, los tipos anónimos que se generan a partir de una declaración LINQ no pueden pasarse a otras capas de una aplicación de n niveles, por lo que el tipo debe definirse de manera concreta o la llamada LINQ debe realizarse en la UI. Gack!
Además, existen problemas de seguridad (cualquiera que sea el usuario al que llama el código LINQ en el servidor MS SQL necesita tener acceso sin restricciones a los datos, por lo que si ese nombre de usuario / contraseña están en peligro, también lo están los datos).
Y, por último, LINQ to SQL solo funciona para MS SQL Server (como viene de MS).
Seguridad.
He visto varias pautas de "mejores prácticas de seguridad" que le recomiendan que haga todo el acceso a sus datos a través de SP, y solo otorga privilegios para ejecutar esos SP.
Si un cliente simplemente no puede select
o delete
en ninguna tabla de base de datos, el riesgo puede ser menor en caso de que el cliente sea pirateado.
Nunca he trabajado personalmente en un proyecto que funcionó de esta manera, siempre parecía un dolor gigante en la parte trasera.
si eso es todo lo que hiciste en sql, ¡no necesitaste sprocs antes!
Tiendo a preferir usar procedimientos almacenados por varias razones:
- hace que la configuración de seguridad sea más fácil (como lo mencionan otros carteles).
- Proporciona una interfaz claramente definida para el acceso a DB (aunque la responsabilidad de esto podría trasladarse a otras áreas, como un DAL escrito en C #
- Encuentro que el Optimizador de consultas, al menos en Oracle, puede tomar decisiones más inteligentes a medida que obtiene más información. Sin embargo, esto realmente requiere pruebas con ambos métodos para sus escenarios específicos.
- Dependiendo de los desarrolladores disponibles, puede tener algunos muy buenos codificadores de SQL que serán mejores en la producción de consultas eficientes si utilizan sprocs.
La desventaja es que puede ser molesto mantener el código que invoca los sprocs sincronizados con la base de datos si las cosas están evolucionando rápidamente. Los puntos sobre la producción de consultas eficientes podrían considerarse una optimización prematura. Al final del día, no hay sustituto para el rendimiento de la evaluación comparativa en condiciones realistas .
Puedo pensar en varias buenas razones para los procedimientos almacenados:
- Cuando se trabaja con tablas más grandes, puede ser difícil generar una consulta eficiente usando LINQ to SQL.
- Un DBA puede analizar y solucionar problemas en los procedimientos almacenados. Pero piense en lo que ocurre cuando chocan dos complicadas operaciones LINQ de diferentes front-ends.
- Los procedimientos almacenados pueden forzar la integridad de los datos. Denegar el acceso de escritura en tablas y permitir cambios solo a través del procedimiento almacenado.
- La actualización de los procedimientos almacenados es tan fácil como ejecutar ALTER PROCEDURE en un servidor. Si una implementación lleva meses y un script de minutos, será más flexible con los procedimientos almacenados.
Para una pequeña aplicación que es mantenida por una persona, los procedimientos almacenados son probablemente excesivos.
Motivo: grandes cantidades de datos para pasar de una tabla a otra.
Digamos que de vez en cuando tiene que archivar elementos de una tabla a otra o hacer cosas similares. Con LINQ eso significaría recuperar, digamos, un millón de filas de la tabla A en el cliente DBMS y luego insertarlas en la tabla B.
Con un procedimiento almacenado, las cosas funcionan bien, en conjuntos.
Llego bastante tarde a este hilo. Pero dependiendo de con quién hables, Linq to SQL está muerto , muy muerto o, en el mejor de los casos, es un zombie .
Además, ninguna herramienta individual se adapta a cada situación: debe elegir la herramienta adecuada para el trabajo específico en cuestión:
- Los procesos almacenados le permiten aplicar reglas comerciales complejas en múltiples aplicaciones de cliente.
- Los procesos almacenados pueden brindarle una excelente capa de seguridad.
- Los procesos almacenados pueden darte una gran capa de abstracción.
- Los procesos almacenados pueden darle mejor almacenamiento en caché en algunas circunstancias .