不错呦!smile@林凯西,确保“准备文件”中的几个文件都有安装,S...您好,看了您这篇帖子觉得很有帮助。但是有个问题想请...我的修改过了怎么还被恶意注册呢 @jjjjiiii 用PJ快9年了,主要是A...PJ3啊,貌似很少有人用PJ了,现在不是WP就是z...@332347365,我当时接入时错误码没有-10...楼主,ChkValue值应为-103是什么意思呢?...大哥 你最近能看到我发的信息,请跟我联系,我有个制...
使用SQL Server2005触发器做站点IP、PV预统计
编辑:dnawo 日期:2010-04-07

上图是一个WEB站点访问日志表,记录了访问对象的相关信息。现在要求增加一个站点每天的IP、PV统计功能,数据量小时直接对Web_AccessLogTB表中的数据进行统计即可,若数据量比较大,这样做就不合适了。解决方法是进行预统计:在用户查看统计之前就已经预先统计好了,用户查看时只是显示下结果而已。
预统计的方式又可分成两种:同步或异步。同步可以写个存储过程来完成,添加访问日志的同时进行预统计;异步是将添加访问日志和预统计两个过程分开,后者可由其他程序来完成,例如Windows服务、触发器等等。显然异步比较合适,下边我们就用触发器来完成。

上图为预统计表,记录每天的IP和PV量。现在要解决的一个问题是IP的统计,到目前为止,每个IP都必须先扫描一次Web_AccessLogTB表,才知道它是不是首次访问,是则IPCount字段加1,这样效率太差了。我们再建一个辅助表(Web_IPLogTB)来解决这个问题:

Web_IPLogTB表记录每天的访问IP,一个IP只记录一次,每天清空一次,这样扫描就快多了。下边是我们的触发器:
复制内容到剪贴板
程序代码

Create TRIGGER [Web_UpdateIPAndPVTG]
ON [dbo].[Web_AccessLogTB]
AFTER Insert
AS
BEGIN
IF @@rowcount>0
BEGIN
DECLARE @clientip nvarchar(50), @recdatetime datetime
DECLARE @ipcount int
Select @clientip=ClientIP,@recdatetime=RecDateTime FROM inserted
SET @recdatetime=DATEADD(day,DATEDIFF(day,0,@recdatetime),0)
IF NOT EXISTS(Select TOP 1 * FROM Web_AccessLog2TB Where RecdateTime=@recdatetime)
BEGIN--新增
Insert INTO Web_AccessLog2TB(RecDateTime,IPCount,PVCount) VALUES(@recdatetime,1,1)
TRUNCATE TABLE dbo.Web_IPLogTB --每天清空
Insert INTO dbo.Web_IPLogTB(RecDateTime,ClientIP) VALUES(@recdatetime,@clientip)
END
ELSE
BEGIN
Select @ipcount=count(1) FROM Web_IPLogTB Where RecdateTime>=@recdatetime AND ClientIP=@clientip
IF @ipcount=0
BEGIN--更新IP和PV
Update Web_AccessLog2TB SET IPCount=IPCount+1,PVCount=PVCount+1 Where RecdateTime=@recdatetime
Insert INTO Web_IPLogTB(RecDateTime,ClientIP) VALUES(@recdatetime,@clientip)
END
ELSE--只更新PV
Update Web_AccessLog2TB SET PVCount=PVCount+1 Where RecdateTime=@recdatetime
END
END
END
ON [dbo].[Web_AccessLogTB]
AFTER Insert
AS
BEGIN
IF @@rowcount>0
BEGIN
DECLARE @clientip nvarchar(50), @recdatetime datetime
DECLARE @ipcount int
Select @clientip=ClientIP,@recdatetime=RecDateTime FROM inserted
SET @recdatetime=DATEADD(day,DATEDIFF(day,0,@recdatetime),0)
IF NOT EXISTS(Select TOP 1 * FROM Web_AccessLog2TB Where RecdateTime=@recdatetime)
BEGIN--新增
Insert INTO Web_AccessLog2TB(RecDateTime,IPCount,PVCount) VALUES(@recdatetime,1,1)
TRUNCATE TABLE dbo.Web_IPLogTB --每天清空
Insert INTO dbo.Web_IPLogTB(RecDateTime,ClientIP) VALUES(@recdatetime,@clientip)
END
ELSE
BEGIN
Select @ipcount=count(1) FROM Web_IPLogTB Where RecdateTime>=@recdatetime AND ClientIP=@clientip
IF @ipcount=0
BEGIN--更新IP和PV
Update Web_AccessLog2TB SET IPCount=IPCount+1,PVCount=PVCount+1 Where RecdateTime=@recdatetime
Insert INTO Web_IPLogTB(RecDateTime,ClientIP) VALUES(@recdatetime,@clientip)
END
ELSE--只更新PV
Update Web_AccessLog2TB SET PVCount=PVCount+1 Where RecdateTime=@recdatetime
END
END
END
评论: 0 | 引用: 0 | 查看次数: 4515
发表评论
请登录后再发表评论!