+ -
当前位置:首页 → 问答吧 → sql 触发器的问题是否需要遍历临时表Deleted?怎么做?

sql 触发器的问题是否需要遍历临时表Deleted?怎么做?

时间:2011-12-23

来源:互联网

如题:最近刚开始研究触发器的例子!首先做了个2个表关联的例子正确,但是3个表就错误了!
先是2个表时
省表
Provinceid Provincename
1 黑龙江
2 吉林
市表
cityid cityname Provinceid
1 哈尔滨 1
2 牡丹江 1
这样时删除省表Provinceid=1时 市表Provinceid=1也删除了
后来我又加了个
县表County
Countyid Countyname cityid
1 尚志 1
2 阿城 1
现在如果删除市表cityid=1县表cityid=1也删除 但是如果删除省表Provinceid=1时提示约束错误,但如果市表中只有一个属于省表的数据就正确,所以我估计是删除市表中省表Provinceid=1时数据不完全
我的省表触发器代码是这样的:
SQL code

CREATE TRIGGER [dbo].[Province_del] 
   ON [dbo].[Province] 
   Instead Of DELETE
AS 
BEGIN
declare @ID bigint

Select @ID=Provinceid from Deleted
Delete From city where Provinceid=@ID 
Delete From Province  where Provinceid=@ID 
END

市表
SQL code

CREATE TRIGGER [dbo].[city_del] 
   ON [dbo].[city] 
   Instead Of DELETE
AS 
BEGIN
declare @ID bigint
Select @ID=cityid from Deleted
Delete From County where cityid=@ID
Delete From city where cityid=@ID 
END



作者: liu415630922tao   发布时间: 2011-12-23

如果省表一次更新多笔记录,触发器里要有游标读取inserted和deleted表,

实现起来有些复杂喔, 建议更新省表的同时, 以SQL语句同时更新市表和县表即可. 

达到相同目的, 而且最简单.

作者: ap0405140   发布时间: 2011-12-23

做级联删除就行了.

作者: xuam   发布时间: 2011-12-23

这种事情最好不要做触发器,设置好外键,用级联删除就行了.

作者: qianjin036a   发布时间: 2011-12-23

lz的判断是没错的。
SQL Server中的触发器与Oracle数据库中的触发器不同。
SQL Server中的触发器不是逐条执行的。
如果定义一个游标遍历Deleted表,应该就没错了。
或者用其他方式遍历也可以。

作者: dielianhua_chenlong   发布时间: 2011-12-23

你保证删除的次序正确就可以了,也就是说省包含地区,地区包含县,增加时是先有省再有地区再有县,删时是先删县再地区再省,级联删除就是这么干的。

在TRIGGER里用游标是前端写UI的写法,数据库的操作基础就是集合操作,遍历不是数据库的长处。

作者: yanyuchonglou   发布时间: 2011-12-23

热门下载

更多