API-интерфейс Microsoft SQL Server

API-интерфейс Microsoft SQL Server

У меня есть идея для приложения, но в идеале оно должно быть основано на возможности написать своего рода движок «переписывания SQL» для MSSQL (примерно так же, как HTTP-серверы могут иметь модули «переписывания URL»), который мог бы пересекать SQL-операторы до того, как сервер их обработает, и сначала запускать какой-то другой код.

Возможно ли это вообще с MSSQL или мне придется искать альтернативный метод достижения своей цели?

решение1

Вопрос не в том, «как» сделать перезапись, а в том, «где» вы хотите, чтобы перезапись произошла. Вы сказали, что хотите, чтобы было что-то вроде IIS, но в MSSQL это невозможно. В IIS у вас есть конвейер обработки запросов, и есть много точек, где вы можете вставить свой пользовательский код в этот конвейер (т. е. создать собственное расширение ISAPI, HTTPModule, события в Global.asax)

В SQL Server нет SQL-конвейера, открытого для разработчиков. Когда SQL-запрос приходит на SQL-сервер, вы не можете его переписать. Триггеры BEFORE или INSTEAD OF update/insert/delete не решат проблему, если вы хотите заменить имя таблицы в исходном запросе, потому что если эта таблица не существует, вы получите исключение до того, как сможете выполнить любую пользовательскую бизнес-логику в триггерах.

Однако вы можете «переписать» SQL на клиенте (не на SQL-сервере), создав пользовательский поставщик данных (если у вас есть приложение ADO.NET). См.MSDN — Реализация поставщика данных .NET Framework. Это непростая задача, которая потребует много усилий. В вашем коде вы можете повторно использовать большинство стандартных функций стандартного поставщика данных MSSQL (System.Data.SqlClient) и переопределять только те функции, где вы хотите разобрать SQL и заменить определенные команды.

Пожалуйста, также посмотритеhttp://sqlfaultretryprovide.codeplex.com/- этот проект был направлен на создание пользовательского поставщика данных .NET для SQL Server, который может автоматически предоставлять функцию "повторить попытку при ошибке". Так что это не SQL-рерайтер, но его можно использовать в качестве примера для создания собственного.

решение2

Вы можете использоватьтриггерыдля INSERT, UPDATE и DELETE, но для SELECT эквивалентного триггера нет.

Альтернативным подходом было бы написать программу, которая перехватываетTDS звонки, изменяет их и передает на сервер SQL. Таким образом, ваша программа будет слушать порт 1433 или что-то в этом роде, а в вашей программе настройки измените порт сервера SQL на прослушивание порта 1434.

решение3

Вероятно, вы рассматриваете создание бизнес-слоя в SQL. Если вы пытаетесь изменить существующее приложение, то у вас могут возникнуть некоторые проблемы, поскольку все адаптеры SQL являются проприетарными, но если ваши приложения можно изменять, вы, вероятно, могли бы написать бизнес-слое, который будет располагаться в базе данных, которая будет обрабатывать команды в SQL-сервере, используя подключение к общей памяти.

Другой вариант — это магическая хранимая процедура CLR, которой вы передаете SQL-код, который затем редактирует его и запускает в базе данных SQL (используя контекстное соединение, которое работает даже быстрее, чем общая память).

Однако учтите, что SQL-сервер написан довольно хорошо, и то, чего вы пытаетесь добиться, лучше всего будет сделать на стороне клиента с помощью API, чтобы обработка распределялась по количеству клиентов и позволяла SQL-серверу оптимизировать фактически выполняемый SQL-запрос.

решение4

Вы можете написать триггеры, использующие классы .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

удачи.

Связанный контент