有两个表,假如分别server,server_Log日志表,其中server是各服务器的状态记录。每三分钟会更新这些记录,并将这些更新记录跟server_log日志表里的最后一次添加的记录进行比较,如果相差一个小时就进行添加。请教这个触发器要如何写。表结构如下
server 表结构
servername[名称]  ip[ip]  onlinenum[在线人数]  totalbandwidth[总量]  cpuuse[占用率]  modtime[修改时间] server_Log表结构
serverlogid[主键自增1] servername[名称]  ip[ip]  onlinenum[在线人数]  totalbandwidth[总量]  cpuuse[占用率]  appendtime[添加时间] 如下是我在server中写的触发器。有误。请高手帮我修正。
CREATE TRIGGER [InsertServerLog] ON [dbo].[server] 
FOR UPDATE
AS
declare @lastmodtime varchar(50)
BEGIN
select  @lastmodtime=appendtime from server_Log order by appendtime desc
INSERT INTO server_Log
SELECT servername,ip,onlinenum,totalbandwidth,cpuuse,modtime FROM server where DATEDIFF(HOUR,@lastmodtime,getdate())=1
END

解决方案 »

  1.   

    select  @lastmodtime=appendtime from server_Log order by appendtime desc
    改为:
    select top 1      /*加上top 1*/
    @lastmodtime=appendtime from server_Log order by appendtime desc
      

  2.   

    server 表有多条记录的。
    加个top 1不能实现。:)
      

  3.   

    CREATE TRIGGER [InsertServerLog] ON [dbo].[server] 
    FOR UPDATE
    AS
    declare @lastmodtime datetime
    BEGIN
    select  top 1 @lastmodtime=appendtime from server_Log order by appendtime desc
    INSERT INTO server_Log(servername,ip,onlinenum,totalbandwidth,cpuuse,appendtime)
    SELECT servername,ip,onlinenum,totalbandwidth,cpuuse,modtime FROM inserted 
    where DATEDIFF(HOUR,@lastmodtime,modtime)=1
    END
      

  4.   

    楼主要求将SERVER表中这些更新记录跟server_log日志表里的最后一次添加的记录进行比较,而最后一次添加的记录实质上就是指server_log表中日期最大.如果按照楼主的代码:
    select  @lastmodtime=appendtime from server_Log order by appendtime desc
    得到的其实是最小值,因为楼主的代码会扫描server_Log表的所有行后取最后一行,不但取的值与预求南辕北辙,而且扫描了整个表,效率被浪费了.

    select top 1 @lastmodtime=appendtime from server_Log order by appendtime desc
    则取的是server_Log表中的最大日期,即按日期由大到小的排序中取第一行.