关于触发器使用(外键)

含主外键关系:
CREATE TRIGGER [dbo].[TriggerDeleteBlogs]    
   ON  [dbo].[T_Blog_Categories]     
   INSTEAD OF DELETE     
AS     
BEGIN            
    DECLARE @CategoryId  INT;    
    SELECT @CategoryId=CategoryId FROM deleted 
    
    DELETE T_Blog_Blogs WHERE CategoryId=@CategoryId     
    DELETE T_Blog_Categories WHERE CategoryId=@CategoryId     
END   


不含主外键关系:
CREATE TRIGGER [dbo].[TriggerDeleteBlogs]     
   ON  [dbo].[T_Blog_Categories]      
   FOR DELETE      
AS      
BEGIN               
    DECLARE @CategoryId  INT;     
    SELECT @CategoryId=CategoryId FROM deleted 
     
    DELETE T_Blog_Blogs WHERE CategoryId=@CategoryId            
END    
------------------------------------------------------------------------------------------------------------------------------------
-- 以下是详解。
-- 2011-12-01最后修改。
------------------------------------------------------------------------------------------------------------------------------------

src:http://www.1589.cn/showArticle0106000000S260.htm

例如以下问题:

父子表的删除问题,如果在删除一个父表时,希望同时删除子表(也称为:外键表、级联表)中的数据,以保持数据的完整性。一般这个功能,很多同学都是使用c#代码来完成,但如果使用触发器,可以方便的解决这一问题。 

一、使用触发器,同时删除两个表中的数据,实例如下:

    
CREATE TRIGGER [dbo].[TriggerDeleteBlogs]     
   ON  [dbo].[T_Blog_Categories]      
   FOR DELETE      
AS      
BEGIN      
    SET NOCOUNT ON;       
    DECLARE @CategoryId  INT;     
    
    SELECT @CategoryId=CategoryId FROM deleted       
    DELETE T_Blog_Blogs WHERE CategoryId=@CategoryId      
 
END    
二、使用触发器,同时删除两个表中的数据,两个表存在主外键的关系,实例代码如下:  
CREATE TRIGGER [dbo].[TriggerDeleteBlogs]    
   ON  [dbo].[T_Blog_Categories]     
   INSTEAD OF DELETE     
AS     
BEGIN   
    SET NOCOUNT ON;    
    DECLARE @CategoryId  INT;    
   
    SELECT @CategoryId=CategoryId FROM deleted      
    DELETE T_Blog_Blogs WHERE CategoryId=@CategoryId     
    DELETE T_Blog_Categories WHERE CategoryId=@CategoryId     
END   

注:理解触发器里面的两个临时的表:Deleted , Inserted 。注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。

 

一个成功的例子:

含外键约束触发器
-- =============================================
-- Author:  ZHAOWEI
-- Create date: 2011-08-04
-- Description: DelApplicantById
-- =============================================
USE [RPS]
GO
ALTER TRIGGER [dbo].[rps_Triggers_DelApplicantFrmPerson]
ON [dbo].[FrmAddress]
INSTEAD OF  DELETE
AS
BEGIN
DECLARE @ID UNIQUEIDENTIFIER
SELECT @ID=Id FROM DELETED
   DELETE
   FROM [dbo].[FrmPerson]
   WHERE [FrmPerson].[FrmAddressFK]=@ID
   DELETE
   FROM [dbo].[FrmAddress]
   WHERE [FrmAddress].[Id]=@ID
END
GO

posted @   skybirdzw  阅读(1159)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示