2014-08-29 131 views
1

我使用SQL Server 2014構建一個支持票系統,ASP.Net MVC 5角JS等發送TCP消息/刪除觸發器

作爲設計的一部分,我想爲我的路系統知道票證何時更新,刪除或創建。

這樣,如果用戶打開了票據並在打開票據時進行了更改,我可以設計系統以強制他們刷新票證,然後他們自己可以對票據進行更改,以防止用戶B重寫用戶A的變化他們沒有看到。

理想情況下,我想設計一個TCP協議服務器作爲Windows服務,並能夠連接到它並從Sql Server中的表觸發器發送數據。

然後,應用程序的前端將使用Javascript和WebSockets。所以應用程序將連接到套接字服務器以及sql服務器。當用戶打開票證時,我會發送一條消息,表明用戶XXY的票證00X打開。當sql服務器發生更改時,它會告知服務器Ticket 00X已更改。然後,Socket服務器告訴連接到它的客戶正在查看Ticket 00X,它已經改變了,並且javascript阻止了一個提交,直到一個新的完成。

但是...可以sql服務器做到這一點?不會出現如此。

所以我想知道是否有可能建立一個SQL Server的插件來支持它像PostgreSQL的通知功能。

更新:

我發現在SQL Server用戶定義的CLR函數和設法得到它的工作。 (C#/ .Net框架),我做了一個靜態類,像一些靜態方法,

public static int NotifyTicketUpdate(int ticketID) 
{ 
    //... 
} 

然後我註冊它在SQL Server中,

USE TLCDB; 
CREATE ASSEMBLY MyCompanyName_MyDll 
FROM 'd:\pathtodll\mydll.dll' 
WITH PERMISSION_SET = SAFE; 

CREATE FUNCTION XYZ_Notify_Ticket_Updated(@input int) RETURNS int 

AS EXTERNAL NAME MyCompanyName_MyDll.UserDefinedFunctions.NotifyTicketUpdated;

然後調用它的SQL,我只是做

select dbo.XYZ_Notify_Ticket_Updated(@ticketIDHere); 

而且它所有的作品。我在c#中的靜態方法將TCP/IP消息發送到我的套接字服務器,然後服務器檢查誰在查看該票證ID並向他們發送Ticket_Updated消息。在客戶端javascript中運行的websocket圖層會看到它,並鎖定更新/保存的票據。

回答

0
  1. 您可以使用CLR,這需要一些設置。
  2. 您可以創建一個EXE,您可以使用SP中的參數進行shell處理。
  3. 你可以實現一些標準的併發。 Optimistic vs Pessimistic

所以是的,這是可能的。

+0

與CLR部分,我只是不知道這意味着什麼正確的蝙蝠。我做了一個用戶定義的功能。 當我完成所有工作後,我想我會創建一個UDT,將websocket客戶端連接到一張票。例如。 UDT將用於存儲TicketID,並且UDT將確定哪些WebSocket客戶端需要通知,以便在sql server中更新該行時,更新觸發器將在其UDT上調用NotifyUpdate。 – 2014-09-02 15:48:25

2

或者您可以使用Service Broker來處理異步通知。不是最簡單的學習,而是輕量級,可擴展且已內置的。