API de Microsoft SQL Server

API de Microsoft SQL Server

Tengo una idea para una aplicación, pero idealmente dependería de poder escribir una especie de motor de "reescritura de SQL" para MSSQL (de la misma manera que los servidores HTTP pueden tener módulos de "Reescritura de URL") que podrían intersectar declaraciones SQL antes. el servidor los maneja y ejecuta algún otro código primero.

¿Es esto posible con MSSQL o tendré que buscar un método alternativo para lograr mi objetivo?

Respuesta1

La pregunta no es "cómo" reescribir, sino "dónde" desea que se realice la reescritura. Dijiste que querías que algo fuera como en IIS, pero esto no es posible en MSSQL. En IIS tiene una canalización de procesamiento de solicitudes y hay muchos puntos donde puede insertar su código personalizado en esta canalización (es decir, crear su propia extensión ISAPI, HTTPModule, eventos en Global.asax).

En SQL Server no hay ninguna canalización de SQL abierta para los desarrolladores. Cuando la solicitud SQL llega al servidor SQL, no puede reescribirla. Los activadores ANTES o EN LUGAR de actualizar/insertar/eliminar no resolverán el problema si desea reemplazar el nombre de la tabla en la consulta original porque si esta tabla no existe, obtendrá una excepción antes de poder ejecutar cualquier negocio personalizado. lógica en los desencadenantes.

Sin embargo, puede "reescribir" SQL en el cliente (no en el servidor SQL) creando el proveedor de datos personalizado (si tiene la aplicación ADO.NET). VerMSDN: implementación de un proveedor de datos de .NET Framework. Esta no es una tarea fácil y requerirá muchos esfuerzos. En su código, puede reutilizar la mayoría de las funciones estándar del proveedor de datos MSSQL estándar (System.Data.SqlClient) y anular solo las funciones en las que desea analizar SQL y reemplazar ciertos comandos.

Por favor mira tambiénhttp://sqlfaultretryprovide.codeplex.com/- este proyecto consistió en crear un proveedor de datos .NET personalizado para SQL Server que pueda proporcionar automáticamente la función de "reintentar en caso de error". Por lo tanto, esta no es una reescritura de SQL, pero puede usarse como ejemplo para crear la suya propia.

Respuesta2

Puedes usardesencadenantespara INSERTAR, ACTUALIZAR y ELIMINAR, pero no existe un activador equivalente para SELECCIONAR.

Un enfoque alternativo sería escribir un programa que interceptellamadas TDS, los modifica y los pasa al servidor SQL. Entonces, su programa debería escuchar en el puerto 1433 o algo así y en su programa de instalación cambiaría el puerto del servidor SQL para escuchar en el puerto 1434.

Respuesta3

Probablemente esté pensando en crear una capa empresarial en SQL. Si está intentando modificar una aplicación existente, es posible que tenga algunos problemas ya que todos los adaptadores SQL son propietarios, pero si sus aplicaciones se pueden modificar, probablemente podría escribir una capa empresarial para ubicarla en la base de datos, que procesaría los comandos en el servidor SQL mediante una conexión de memoria compartida.

Otra opción es un procedimiento almacenado CLR mágico al que usted alimenta el SQL, luego lo edita y lo ejecuta en la base de datos SQL (usando una conexión de contexto que es incluso más rápida que la memoria compartida).

Sin embargo, tenga en cuenta que el servidor SQL está bastante bien escrito; algo como lo que intenta lograr probablemente se lograría mejor en el cliente utilizando una API para que el procesamiento se distribuya según la cantidad de clientes y permita que el servidor SQL optimice el SQL real. correr.

Respuesta4

Puede escribir activadores que empleen clases .net.

http://www.15seconds.com/issue/041006.htm

http://aspalliance.com/1273_CLR_Triggers_for_SQL_Server_2005.all

http://www.google.com/search?rlz=1C1_____enUS397US397&sourceid=chrome&ie=UTF-8&q=sql+.net+trigger

buena suerte.

información relacionada