Назад | Перейти на главную страницу

API Microsoft SQL Server

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

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

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

В SQL Server нет конвейера SQL, открытого для разработчиков. Когда SQL-запрос пришел на SQL-сервер, вы не можете его переписать. Триггеры ПЕРЕД или ВМЕСТО обновления / вставки / удаления не решат проблему, если вы хотите заменить имя таблицы в исходном запросе, потому что, если эта таблица не существует, вы получите исключение до того, как сможете выполнить любое пользовательское дело. логика в триггерах.

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

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

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

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

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

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

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

Когда вы говорите «Перезапись URL», вы действительно имеете в виду «URL»? Потому что я не знал, что к SQL Server когда-либо обращались по URL.

Если вы имели в виду это как аналогию, не могли бы вы пояснить?

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

удачи.