大家好,
我写了一个删除类触发器,在删除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表里面的相应数据还是在。
我写了一个删除类触发器,在删除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表里面的相应数据还是在。
解决方案 »
- 请问SQL SERVER中如何控制读取权限
- 新手关于 添加/更改/删除 主键 的问题!!!
- 有懂vb.net的么
- 模糊日期查询问题,不能查询单月单日和双月单日
- 为什么sql2000的datetime类型不能存储1700年以前的日期?
- 手机商城数据库设计的问题?讨论者有分啊!
- SQL简单问题?
- 一道没有做出来的面试题
- 呼唤高手!!!1)sql server 运行时,可以对sql 的表内的数据(就是在mysql\data下)进行拷贝吗?
- The database has to be run 24 hr/day and 7 days/week
- 如上图的注册名(local) 如何才能被修改为 localhost
- case 后面可以加SQL语句吗?
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
执行一条语句如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的相关记录。