在更新/插入/删除触发器中发送TCP消息

时间:2014-08-29 18:04:27

标签: sql-server asp.net-mvc-5 sql-server-2014

我正在使用Sql Server 2014,ASP.Net MVC 5,角度JS等构建支持服务单系统。

作为设计的一部分,我想让我的系统知道何时更新,删除或创建故障单。

这样一来,如果一个用户打开了一个票据并且在打开它时进行了更改,我可以设计系统以强制他们刷新票证,然后他们自己可以对其进行更改,以防止用户B覆盖用户A的他们没见过的变化。

理想情况下,我想将TCP协议服务器设计为Windows服务,并能够连接到它并从Sql Server中的表触发器发送数据。

然后应用程序前端将使用Javascript和WebSockets。因此应用程序将连接到套接字服务器以及sql server。当用户打开票证时,我会发送用户XXY打开Ticket 00X的消息。当在sql server中发生更改时,它会告知服务器Ticket 00X已更改。然后,Socket服务器告诉连接到它的客户端正在查看Ticket 00X它已经更改,并且javascript阻止提交,直到完成一个新的。

但是...... sql server可以这样做吗?不会出现。

所以我想知道是否可以为SQL Server构建一个插件,以便像PostgreSQL的Notify功能一样支持它。

更新

我在SQL Server中发现了用户定义的CLR函数,并设法使其正常工作。 (C#/ .Net Framework)我用一些静态方法创建了一个静态类,比如

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层可以看到它,并锁定更新/保存的票证。

2 个答案:

答案 0 :(得分:2)

或者您可以使用Service Broker来处理异步通知。这不是最简单的学习方法,而是轻量级,可扩展且已经内置。

答案 1 :(得分:0)

  1. 您可以使用CLR,这需要一些设置。
  2. 您可以创建一个EXE,您可以使用SP中的参数进行shell。
  3. 您可以实现一些标准并发。 Optimistic vs Pessimistic
  4. 是的,这是可能的。