2010-08-18 70 views
2

我們有一個正在開發的網站維護一個數據庫。這個網站正在取代傳統的ASP頁面和FoxPro應用程序,以及用ASP.NET 3.5編寫的新開發(主要是VB,一些C#和一些AJAX)。但是,還有其他系統會更新我們的數據庫。由於這些系統會執行更新數據中狀態的操作,所以我們在數據庫中有一些觸發器(SQL Server 2005)。通常它是用SQL處理的簡單東西,但現在我們還有別的東西。如何從SQL TRIGGER執行.NET代碼?

我們的用戶將上傳並存儲一個文件(Excel電子表格),該文件將具有數據庫更新,只有當外部系統提供超時(即觸發器觸發時)時纔會處理該數據庫。該文件將作爲任何其他「附件」(我們的數據庫指向特定目錄中的文件的指針)進行存儲,因爲它需要事先進行驗證(很久之後纔會實際處理)。

當SQL觸發器觸發時,我們想要做的是執行與'驗證'文件相同的方法(除了這次它實際上會處理更新)。

有沒有一個相對簡單的方法來做到這一點?

回答

3

你必須使用CLR Stored Procdure ...

見這裏的一個例子http://www.codeproject.com/KB/database/Managed_Code_in_SQL.aspx

微軟也有在CodePlex上有SQL Server Database Engine Samples一些CLR的實例之前,它已經完成。

祝你DBA退出。

另一種選擇是使用xp_cmdshell並在naitive系統上執行一個「命令」,然後可以調用您的.net代碼。再次..與DBAS的好運;)

除了這兩個我不能想到任何其他「簡單」的方式來做到這一點。有很多複雜的方法來做到這一點..

+0

感謝的最佳解決方案。是的,我看到那篇文章,並且我們無法控制服務器環境。我們不確定我們是否有權執行此類操作,因此我們正在尋找一些不那麼複雜的事情。 – David 2010-08-18 12:33:49

+0

當你說不那麼複雜你是什麼意思? – Nix 2010-08-18 12:36:24

+0

「不那麼複雜」是指涉及更少的步驟,不涉及瞭解服務器硬盤驅動器的物理佈局,並試圖請求並請求DBA許可。 – David 2010-08-18 13:06:34

0

我已經在數據庫上的程序集中做了一些模糊搜索。這非常棘手。首先,您不能使用.NET 2.0擴展(V3.0,V3.5,V4.0),具體取決於SQL Server版本。其次,你必須確保你只使用託管代碼。沒有COM-Interops等

我會想一個更好的解決方案,因爲觸發器應該非常快,處理excel可以非常緩慢。如何在該表上進行輪詢的外部流程?

+0

您可以加載2.0,3.0和3.5中的任何一個,到目前爲止它們都是基於運行時版本2.0的基礎(擴展)。但4.0不是基於2.0並且有它自己的運行時 – abatishchev 2010-08-18 12:44:41

0

我會讓觸發器將一個條目放入一個隊列中進行處理,並讓隊列主動監視需要執行的動作。這可以像表格一樣簡單,也可以像Web服務調用一樣複雜。但它應該很快。

通常,您不希望觸發操作冗長或涉及更高級別的業務邏輯。應該使用觸發器將數據庫維護在一個狀態,以便數據庫可以爲所有數據庫用戶提供一致的服務(因此觸發器中的低級業務邏輯仍然正常)。一旦到達應用程序級別的業務邏輯,您確實不希望將其緊密耦合到您的數據庫中。