SQL---触发器

摘要:
当表执行相应的操作时,将触发相应的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

免责声明:文章转载自《SQL---触发器》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇vue项目在nginx中不能刷新问题Free Online SQL Formatter下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

k8s 之Job/CronJob

Job 我们可以用job来创建一个任务 用kubectl get jobs 进行查看 kubectl describe job kubectl get pod 查看对应的pod kubectl logs $podName 查看对应的pod 的日志 对于不需要的job 可以通过kubectl delete job $job_name 进行删除,这样job对...

Android智能指针sp wp详解

研究Android的时候,经常会遇到sp、wp的东西,网上一搜,原来是android封装了c++中对象回收机制。说明:1. 如果一个类想使用智能指针,那么必须满足下面两个条件:a. 该类是虚基类RefBase的子类或间接子类b. 该类必须定义虚构造函数。如virtual ~MyClass(); 2. 本文以类BBinder来进行说明,其余类使用sp或wp...

Oracle12c 性能优化攻略:攻略1-1:创建具有最优性能的数据库

一:章节前言 本章着眼于影响表中数据存储性能的数据库特性。 表的性能部分取决于在创建之前所应用的数据库特性。例如:在最初创建数据库时采用的物理存储特性以及相关的表空间都会在后来影响表的性能。类似地,表性能还受到最开始选择的物理特性的影响。例如:表类型和数据类型。 因此应用实践中使用的数据库、表空间、和表的创建标准(并将性能问题放在心上),就形成了优化数据...

jQuery实现全选/反选和批量删除

<%@ page language="java" contentType="text/html; charset=utf-8"     pageEncoding="utf-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.or...

【数据库】通过触发器实现审计日志记录-应用篇

PostgreSQL触发器,日志审计小神器   最近遇到的项目问题,审计日志记录不够详细,比如某用户编辑了某台设备,只记录了用户操作的设备名、操作时间、登录用户和登录IP,至于设备其他属性编辑前和编辑后的信息就没有更详细的对比了,审计粒度不够细,显然是不能让客户满意的,秉承客户满意优先原则,只好技术加持一波了。   实际客户想要记录的更多,涉及的业务属性比...

Confluence 6 权限概述

下面的权限可以指派给任何一个空间: 分类 权限 全部(All) 查看(View)给你能够查看空间内容的权限,包括有空间目录和其他的内容,例如主面板。 删除自己(Delete own)给你权限删除你在空间中创建的任何页面,博客页面,附件和评论(不管其他用户是否在这个页面中进行了修改或者编辑)。 页面(Pages) 添加页面(Add...