SQL SERVER 实时的取得在线用户列表

 我们在开发C/S管理系统时往往需要限制用户登陆,如同一用户名只能单点登陆或同一IP只能单点登陆,解决这类问题的关键是获取正真在线用户的列表。由于各种原因(如掉线、网络故障、死机等),实时在线用户列表较难获得,我们不得不定时刷新在线用户数据表,在指定的时间内未刷新数据的用户视为离线用户。这一方式较好的解决了在线用户列表获取问题,但存在2个问题:1、实时性较差,2、需额外的资源进行维护。
    我们知道系统表MASTER..SYSPROCESSES记录了一些用户登陆的信息,表中program_name字段为登陆的管理系统程序名,该字段的内容对绝大多数管理系统无实质性的意义,我们能否从program_name做文章,较为实时的取得在线用户列表呢?
   答案是可以的,首先我们的管理系统在启动时产生一 GUID,并转换成字符串,假设为:LinkGuid,我们在编写SQL SERVER的链接字串时采用如下格式:
       'Provider=SQLOLEDB.1;Password=' + Password
        + ';Persist Security Info=True;User ID=' + USERNAME + ';Initial Catalog=' + databasename
        + ';Data Source=' + servername +';Application Name='+LinkGuid;
    一旦管理系统登陆成功,我们可以从系统表MASTER..SYSPROCESSES中查到program_name字段为LinkGuid串的登陆链接信息。
    登陆成功后,我们只需将登陆信息插入自己定义的数据表中,假设为:[数据安全],表的字段包括LinkGuid、Username、UserIp等信息,此表只需插入数据,登陆后不再需要维护。那么,我们随时可以采用如下的SQL语句查到当前在线用户列表:
    
  select LinkGuid,Username,UserIp from [数据安全] where exists(select net_address from MASTER..SYSPROCESSES where program_name=LinkGuid)

    经大量测试,上述在线用户列表的实时性大的超过常规需定时刷新的在线用户的列表,实用性较高,数据不需定时维护。

猜你喜欢

转载自blog.csdn.net/dcopyboy/article/details/79927238
今日推荐