微軟SQL伺服器API

微軟SQL伺服器API

我有一個應用程式的想法,但理想情況下,它依賴於能夠為MSSQL 編寫一種「sql 重寫」引擎(與HTTP 伺服器可以具有「URL 重寫」模組的方式非常相似),該引擎可以在先前與sql 語句相交伺服器處理它們並首先執行一些其他程式碼。

這對於 MSSQL 是否可行,或者我是否需要尋求替代方法來實現我的目標?

答案1

問題不在於「如何」進行重寫,而是您希望在「何處」進行重寫。你說你想要像 IIS 中那樣的東西,但這在 MSSQL 中是不可能的。在 IIS 中,您有請求處理管道,並且有很多地方可以將自訂程式碼插入到此管道中(即在 Global.asax 中建立您自己的 ISAPI 擴充功能、HTTPModule、事件)

在 SQL Server 中,沒有向開發人員開放的 SQL 管道。當SQL請求到達SQL Server時,你無法重寫它。如果您想要取代原始查詢中的表名,那麼 BEFORE 或 INSTEAD OF update/insert/delete 觸發器將無法解決問題,因為如果該表不存在,您將在執行任何自訂業務之前收到異常觸發器中的邏輯。

但是,您可以透過建立自訂資料提供者(如果您有 ADO.NET 應用程式)在客戶端(而不是 SQL 伺服器上)「重寫」SQL。看MSDN - 實作 .NET Framework 資料提供者。這不是一件容易的事,需要付出很多努力。在您的程式碼中,您可以重複使用標準 MSSQL 資料提供者 (System.Data.SqlClient) 的大多數標準功能,並僅覆寫您想要解析 SQL 和取代某些命令的函數。

還請大家關注http://sqlfaultretryprovide.codeplex.com/- 這個專案是為 SQL Server 建立一個自訂的 .NET 資料提供程序,它可以自動提供「錯誤重試」功能。所以這不是一個 SQL 重寫器,但可以作為建立自己的範例。

答案2

您可以使用觸發器對於 INSERT、UPDATE 和 DELETE,但沒有等效的 SELECT 觸發器。

另一種方法是寫一個程式來攔截TDS 通話,修改它們,並將它們傳遞到 SQL Server。因此,您可以讓您的程式偵聽連接埠 1433 或其他端口,並在您的安裝程式中將 SQL Server 連接埠變更為偵聽連接埠 1434。

答案3

您可能正在考慮在 SQL 中建立業務層。如果您嘗試修改現有應用程序,那麼您可能會遇到一些麻煩,因為SQL 適配器都是專有的,但如果您的應用程式可以修改,您可能可以編寫一個位於資料庫上的業務層,該層會將指令處理為SQL Server 以共享記憶體連線。

另一個選擇是神奇的 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

祝你好運。

相關內容