日期:2014-05-19  浏览次数:20384 次

触发器删除同一表中的级联数据,用以上语句删除。怎么只能删除当前数据和他下一级的。
delete   from   shopclass   where   parentid   in   (select   id   from   deleted)

parentid保存他父级的id



------解决方案--------------------
给你个例子
当前数据库中有“uMateriel”和“uRecord”两张表,他们分别用来保存物品信息和物品的出入库记录信息,结构如下
引用:
uMateriel
----------------
mId   int
mName  nvarchar(40)
mNum   int DEFAULT 0

uRecord
----------------
rId   int
mId   int
rNum   int
rDate  datetime DEFAULT GetDate()
rMode  bit DEFAULT 0

好了,数据表已经有了,现在看一下实际的应用。
现在,我们要购入物品A,数量100,时间为当天,已知物品A的编号为1,那么通常我们需要做以下两个步骤:
引用:
1、在 uRecord 记录表中增加一条物品A的购入记录:
  INSERT INTO uRecord (mId, rNum, rMode) VALUES (1, 100, 0)
2、更新 uMateriel 物品库存表中物品A的数量:
  UPDATE uMateriel SET mNum = mNum + 100 WHERE mId=1

现在根据上面的语法我们建立一个触发器(注意一点,触发器是附于一张表或视图的,所以只能在表里建立或在查询分析器里建立),这个触发器的功能就是自动更新库存数量

--------------------------------------------
引用:
CREATE TRIGGER [trUpdateMaterielNum] ON [dbo].[uRecord]
-- 表明在插入记录之后执行这个触发器
AFTER INSERT
AS
-- 当前更新的编号
DECLARE @intID int
-- 当前更新的数量
DECLARE @intNum int
-- 当前模式
DECLARE @intMode int
-- 判断是否有记录录被更新,@@ROWCOUNT是系统函数,返回受上一语句影响的行数。
IF @@ROWCOUNT > 0
BEGIN
-- 取得当前插入的物品编号和数量,Inserted 表用于存储 INSERT 和 UPDATE 语句所影响的行的副本。
SELECT @intID=mId,@intNum=rNum,@intMode=rMode FROM Inserted

-- 判断当前模式(0为入库,1为出库)来更新当前物品的数量
IF @intMode = 0
UPDATE uMateriel SET mNum = mNum + @intNum WHERE mId=@intID
ELSE
UPDATE uMateriel SET mNum = mNum - @intNum WHERE mId=@intID
END
------解决方案--------------------
要看你的表是否选择了递归触发器的属性,不然是不能递归触发的,当然不能删除下下级了