大家好,
我写了一个删除类触发器,在删除A表里的数据的时候,删除触发器负责删除B表里面对应的数据。在sqlserver的查询分析器里面可以,但是我用java 的 sql 语句删除A表里的数据,B表里的却没有被删掉,好像是触发器没有被执行,百思不得其解,为什么啊?
下面是我写的触发器:IF EXISTS (SELECT name 
   FROM   sysobjects 
   WHERE  name = N'sixhourTriger2' 
   AND    type = 'TR')
    DROP TRIGGER sixhourTriger2
GOCREATE TRIGGER sixhourTriger2
ON filter
for delete
AS
declare @projectName varchar(50),@mobile_telephone varchar(13),@attend int
select @projectName=projectName,@mobile_telephone=mobile_telephone,@attend=attend from deleted
delete  sixHourRpt  where projectName=@projectName and mobile_telephone=@mobile_telephone
GO 奇怪的是为什么在sql server的查询分析器里可以,可是在java里调用sql语句删除A表里数据的时候,B表里面的相应数据还是在。

解决方案 »

  1.   

    CREATE TRIGGER sixhourTriger2
    ON filter
    for delete
    AS
    --declare @projectName varchar(50),@mobile_telephone varchar(13),@attend int
    --select @projectName=projectName,@mobile_telephone=mobile_telephone,@attend=attend from deleted
    --delete sixHourRpt where projectName=@projectName and mobile_telephone=@mobile_telephone/*
    上面的写法,只适合每次只删除一条记录的情况。对于批量删除,逻辑表DELETED里不止一条记录:
    select @projectName=projectName,@mobile_telephone=mobile_telephone,@attend=attend from deleted
    最终,所有的变量只取得最后一条记录对应的值。所以,当批删除时,无论你删除多少,触发器每次只删除其中一条。你在JAVA里应该就是批提交,不可能是一条一条提交。
    */--这样改改就OK了:
    delete a from sixHourRpt a, deleted b where a.projectName=b.projectName and a.mobile_telephone=b.mobile_telephone
    --原来的变量@attend并没用到,不知何用意。
    GO
      

  2.   

    多谢您的回复。attend是filter表里面的一个字段名。根据您说的,我现在试试。
      

  3.   

    Limpire 说的很对!
    执行一条语句如delete from filter 
    它是将所有的记录都删除,所有的信息都一次行传递到系统临时表deleted 里面
    使用 
    CREATE   TRIGGER   sixhourTriger2 
    ON   filter 
    for   delete 
    AS 
    select * from deleted 
    语句可以查看到deleted里的所有信息。
    删除所有信息之后才执行出发器里面的语句。
    所以delete   a   from   sixHourRpt   a,   deleted   b   where   a.projectName=b.projectName   and   a.mobile_telephone=b.mobile_telephone 才能删除所有的sixHourRpt的相关记录。