刚接触触发器,自己也在学习中,有点急用,特来向各位朋友学写了,不吝赐教!谢谢!
要实现下面的功能:---------------------------------------------
示例数据:
attr_a      attr_b           attr_c           attr_p
1             ww        2006-8-17 18:44:22       1
2             ee        2006-8-17 18:23:42       2
1             ww        2006-8-17 18:56:12       3
----------------------------------------------
其中attr_p是主键,自增attr_a是某个人的编号,attr_b是他的名字,attr_c是插入记录的时间。
现在我需要写一个触发器,每插入一条数据都要先判断数据库中是否有这个人当天的插入记录,如果没有就插入该条记录,如果有就继续判断他今天的记录是一条吗?如果是的话那么插入现在想插入的记录。如果有两条今天的记录,那么我要找出时间上晚一些的那条记录然后更新它,更新的只是时间。。
谢谢大家了,感觉比较难了点,没有什么头绪!

解决方案 »

  1.   

    --感觉不太对,先测一下吧
    --测试表
    CREATE TABLE TB1(Attr_a int,attr_b varchar(10),attr_c datetime,attr_p int identity(1,1))
     --触发器
    CREATE TRIGGER TRI_TB1
    ON TB1
    INSTEAD OF INSERT
    AS
    DECLARE @NUM INT
    SELECT @NUM=COUNT(*) 
    FROM TB1 
    WHERE DATEDIFF(DAY,ATTR_C,GETDATE())=0
    SELECT @NUM
    IF @NUM<2 
      BEGIN
       INSERT TB1(Attr_a,Attr_B,Attr_C) SELECT Attr_a,Attr_B,Attr_C FROM INSERTED
       RETURN
      END
    ELSE
    UPDATE A 
    SET ATTR_C='2006-4-4'
    FROM TB1
    ----TEST
    INSERT TB1
    SELECT 1,'AA','2005-8-8'
    SELECT * FROM TB1
      

  2.   

    我喜欢用存储过程,你自己改为触发器吧。
    create table tb
    (
    attr_a int,
    attr_b varchar(30),
    attr_c datetime,
    attr_p int identity(1,1)
    )create proc tbInsert
    (
    @attr_a int,
    @attr_b varchar(30)
    )
    as
    declare @Record int
    declare @MaxId intselect 
    @Record=count(1),
    @MaxId=max(attr_p) 
    from tb 
    where 
    attr_a=@attr_a and datediff(day,attr_c,getdate())=0if @Record=0 or @Record=1
    insert tb(attr_a,attr_b,attr_c) values(@attr_a,@attr_b,getdate())
    else
    begin
    if @Record=2 
    update tb set attr_c=getdate() where attr_a=@attr_a and attr_p=@MaxId
    end 
      

  3.   

    修改1楼的
    CREATE TRIGGER TRI_TB1
    ON TB1
    INSTEAD OF INSERT
    AS
    declare @nowdatetime datetime 
    set @nowdatetime=getdate() --保存记录时间
    DECLARE @NUM INT
    SELECT @NUM=COUNT(*) 
    FROM TB1 
    WHERE DATEDIFF(DAY,ATTR_C,GETDATE())=0
    SELECT @NUM
    IF @NUM<2 
      BEGIN
       INSERT TB1(Attr_a,Attr_B,Attr_C) SELECT Attr_a,Attr_B,Attr_C FROM INSERTED
       RETURN
      END
    ELSE
    UPDATE A 
    SET ATTR_C=@nowdatetime
    FROM TB1
    where ATTR_C in (select max(ATTR_C) from TB1 where DATEDIFF(DAY,ATTR_C,GETDATE())=0)
      

  4.   

    --这个才是正确的
    CREATE TRIGGER TRI_TB1
    ON TB1
    INSTEAD OF INSERT
    AS
    declare @Attr_C datetime ,@Attr_a varchar(50),@Attr_B varchar(50)
    select @Attr_a=Attr_a,@Attr_B=@Attr_B,@Attr_C=@Attr_C  from inserted 
    DECLARE @NUM INT
    SELECT @NUM=COUNT(*) 
    FROM TB1 
    WHERE Attr_a=@Attr_a and DATEDIFF(DAY,ATTR_C,@Attr_C)=0
    IF @NUM<2 
      BEGIN
       INSERT TB1(Attr_a,Attr_B,Attr_C) SELECT Attr_a,Attr_B,Attr_C FROM INSERTED
       RETURN
      END
    ELSE
    UPDATE A 
    SET ATTR_C=@Attr_C
    FROM TB1
    where ATTR_C in (select max(ATTR_C) from TB1 where Attr_a=@Attr_a  and  DATEDIFF(DAY,ATTR_C,GETDATE())=0)
      

  5.   

    谢谢你们的热心帮助!
    我写了如上说的:
    CREATE TRIGGER TRI_TB1
    ON TB1
    INSTEAD OF INSERT
    AS
    declare @Attr_C datetime ,@Attr_a varchar(50),@Attr_B varchar(50)
    select @Attr_a=Attr_a,@Attr_B=@Attr_B,@Attr_C=@Attr_C  from inserted 
    DECLARE @NUM INT
    SELECT @NUM=COUNT(*) 
    FROM TB1 
    WHERE Attr_a=@Attr_a and DATEDIFF(DAY,ATTR_C,@Attr_C)=0
    IF @NUM<2 
      BEGIN
       INSERT TB1(Attr_a,Attr_B,Attr_C) SELECT Attr_a,Attr_B,Attr_C FROM INSERTED
       RETURN
      END
    ELSE
    UPDATE A 
    SET ATTR_C=@Attr_C
    FROM TB1
    where ATTR_C in (select max(ATTR_C) from TB1 where Attr_a=@Attr_a  and  DATEDIFF(DAY,ATTR_C,GETDATE())=0)
    但是在语法检测老是通不过呀,提示:
    错误156:在关键字’FOR‘附近有语法错误!
    然后我删除了instead编译是通过了,但是在插入记录的时候提示对象名instead无效
      

  6.   

    原来我把OF写成了FOR但是改过来后语法检测是通过了,
    但是在插入记录的时候总是提示对象名INSTEAD无效
    我也在努力中,渴望继续关注
    再谢!
      

  7.   

    你是不是又写错了,代码在我这里可以通过的!你是不是将INSERTED 写成INSTEAD了?