none
触发器疑问 RRS feed

  • 问题

  • 有两张表 
    表1  存储日志信息 字段(id,balabalaba,ip,account) 
    表2  存储IP和字段对应表 字段(id,ip,account)

    前端系统insert into 表1的日志信息中 account 是空字符串,需要根据insert字段中ip的值去 表2中获得account的值,来修改
    现通过触发器 来达到需求: 

    问题1: 用for 插入后update log表中记录, 还是instead of  在插入前修改记录再插入 ?

    问题2 :  下面是用for写的 ,有什么可改进的,最重要的! 用instead of该怎么写呢????

    Create Trigger test
    On  表1                      
    for insert                   
    As                                      --
    begin
    decalre @account  varchar(30)   ,@ip  char(20)  @id  int
    select @ip = ip ,@id = id from inserted
    select @account = account from 表2 where ip = @ip            
    Update 表1  Set account=@account  From 表1 
      Where  id=@id
       end                             
    2015年9月10日 1:08

答案

  • 逻辑上,单条记录你那个没疸,update 涉及多条记录就有问题了,通常是直接关联更新

    Update 表1  Set account=表2.account
    From 表1, inserted I, 表2
    Where 表1.id=I.id and  表2.ip = I.ip

    • 已标记为答案 lix201509 2015年9月10日 9:17
    2015年9月10日 1:51

全部回复

  • for 也就是 after, 这个触发时,表中有数据

    instead of , 这个触发的时候,数据还没有放到表中

    通常是用 after 的,用 instead of 的话,你只能从 instered 这个逻辑表中取数据,从表中是取不到数据的

    2015年9月10日 1:47
  • 逻辑上,单条记录你那个没疸,update 涉及多条记录就有问题了,通常是直接关联更新

    Update 表1  Set account=表2.account
    From 表1, inserted I, 表2
    Where 表1.id=I.id and  表2.ip = I.ip

    • 已标记为答案 lix201509 2015年9月10日 9:17
    2015年9月10日 1:51
  • 十分感谢 问题解决了 就是CPU占用高了点

    本来该前端做关联插入的事 现在数据库这边做也只有这样了

    2015年9月10日 9:18