zoukankan      html  css  js  c++  java
  • SQL---触发器

    一、什么是触发器?

    一段SQL代码,挂到某个表的某个增、删、改的操作上。

    当这个表执行相应的操作时,就会触发这段相应的SQL代码。

    触发器与存储过程的区别

    1.存储过程是独立于表存在的,触发器需要依附某个表的某个操作。

    2.存储过程需要使用名称去调用才能执行,触发器则在表的操作过程中自动被触发调用。

    二、触发器的分类:

    after触发器

    ——先执行表的增删改的操作后,再触发触发器。

    instead of 触发器

    ——不执行表的增删改操作,它的这些操作只起到取触发触发器的功能。

    三、创建触发器的语法

    create trigger 触发器名 on 表名 after/instead of  insert/delete/update

    as

    go

    四、触发器中两个临时表:inserted,deleted

    这两个表是临时表,触发器执行完成后,会自动消失,再次触发会再次创建。

    这两个表的结构与on后面的那表的结构是一样的(列名、列数、类型)。而且里面只有一条记录。

    插入操作--把新增的数据放到inserted表中。

    删除操作--把删除的数据放到deleted表中。

    修改操作--把旧数据放到deleted表中,把新数据放到inserted表中。

    五、对两个临时表的使用。

    从两个临时表中把数据取出来放到变量中,以备后面的使用。

    案例一:做一个汽车变动表,汽车的增加、删除后都往变动表中增加一条。用触发器来实现。After触发器:

    代码:

    --创建触发器(汽车增加后启动触发器)

     1 delete from Car where Code='c003' 
     2 
     3 create trigger TR_Car_Insert on car after insert
     4 
     5 as
     6 
     7 --第一步:把插入的数据的name和price取出来,放在两个变量中
     8 
     9 declare @name varchar(50),@price decimal(8,2)
    10 
    11 select @name=name,@price=price from inserted
    12 
    13 --第二步:把上面的两个变量插入CarDelete表中
    14 
    15 insert into cardelete values(@name,@price)

     

    --创建触发器(删除后启动触发器)

     1 create trigger TR_Car_Delete on car after delete
     2 
     3 as
     4 
     5 --触发器在运行的时候会有两个临时表,表的名子是固定的分别叫inserted,deleted
     6 
     7 --第一步:把刚刚删除的这行数据的name和price取出来,放在两个变量中
     8 
     9 declare @name varchar(50),@price decimal(8,2)
    10 
    11 select @name=name,@price=price from deleted
    12 
    13 --第二步:把上面的两个变量插入到CarDelete表中
    14 
    15 insert into CarDelete values(@name,@price)
    16 
    17 go
    18 
    19 go

    案例二:把Info的数据删除,删除之前先用触发器把Work和Family两个表中的相应数据删掉。instead of触发器

    代码:

    delete from Info where Code='p003'
    
    alter trigger TR_INFO_DELETE on Info instead of delete
    
    as
    
    --从临时表中获取出主键值
    
    declare @code varchar(50)
    
    select @code=code from deleted
    
    --从work中的InfoCode列中删除上面那个值
    
    delete from work where infocode=@code
    
    --从Family中的InfoCode列中删除上面的那个值
    
    delete from family where infocode=@code
    
    --从Info中删除Code中上面的那个值
    
    delete from info where code=@code
    
    go
  • 相关阅读:
    Java.util.concurrent包学习(一) BlockingQueue接口
    [转载]最牛B的编码套路
    思考人生
    非奇异矩阵的零度互补法则
    Hopfield 网络(下)
    Hopfield 网络(上)
    矩阵的相似性与对角化
    左右特征向量
    特征多项式、代数重数与几何重数
    特征值和特征向量
  • 原文地址:https://www.cnblogs.com/woniu-net/p/4770319.html
Copyright © 2011-2022 走看看