SQL--存储过程+触发器 对比!
一、存储过程
一:存储过程:存储过程是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中。
可以用存储过程名字和参数来调用存储过程,这样可以避免代码重复出现,用起来也方便。
例: 下面是定义了一个名为Buyfruit的存储过程,参数为购买人的姓名,水果名称,购买数量三个,此存储过程的作用是,输入了这三个参数之后,判断账户余额和库存是否足够,足够的话将账户余额减掉花费,将库存减掉购买的数量显示出来,打印一个订单,和一个明细。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
create PROCEDURE BuyFruit @username varchar(20), @fruitname varchar(20), @buycount int = 0 AS BEGIN declare @kc int,@price float,@fruitid varchar(20) --先把该水果的库存量找出来 select @fruitid=ids, @kc = numbers,@price=price from fruit where name=@fruitname --根据购买数量和库存的关系,进行购买 if @buycount < @kc begin declare @money decimal(18,2) select @money = account from login where username=@username --根据用户名找到账户余额 if(@money > @price*@buycount) begin update login set account=account-@price*@buycount where username=@username update fruit set numbers = numbers-@buycount where name=@fruitname declare @ordercode varchar(50) set @ordercode ='O'+cast(getdate() as varchar(50)) insert into orders values(@ordercode,@username,GETDATE()) insert into orderdetails values(@ordercode,@fruitid,@buycount) end else begin print '余额不足' end end else begin print '库存不足' end END |
购买之前数据库中的内容:
购买成功之后数据库中存储的内容:
添加到订单的和购买明细:
二:触发器
触发器是一种特殊的存储过程
触发器主要是通过事件进行触发而被自动执行的,而存储过程可以通过存储过程名字而被直接调用
触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性,另外还有强化约束和级联运行的功能。
关于inserted和deleted临时表
这两个表是由系统管理的,存储在内存中,不是存储在数据库中,因此不允许用户直接对其修改,是只读的,系统在执行插入操作的时候先将数据插入到inserted临时表中,然后再向数据库的表中插入,在插入下一条时这条被删除;执行删除操作的时候,先将数据传到deleted表里,再删除数据,起到一个保存临时数据用来恢复或者记录的作用。
下面这个是做了一个删除时触发的触发器,在删除student表中数据时,将删除的这一行插入到biandong表里面
--用于删除触发的触发器:
create trigger TR_STUDENT_DELETE
on student
for delete --for触发器after触发器,删除后触发
as
declare @no varchar(3),@name varchar(4)
select @no=sno,@name=sname from deleted --用到了临时表
insert into biandong values(@no,@name,'100')
go
--下面执行删除的时候触发上面的程序,
delete from student where sname='猴子'
还有一种是instead of触发,触发的时候用触发器里面的程序代替执行操作,即执行触发器里面的东西
下面例子,原来三个表,由info表里的code约束另外两个表,因此没法单独删除info中的某一行,利用触发器可以删除三个表中code为p001的行
create trigger TR_INFO_DELETE
on info
instead of delete --instead of 触发器,删除的时候替代执行触发器
as
declare @code varchar(20)
select @code=code from deleted
delete from family where infocode=@code
delete from work where infocode=@code
delete from info where code=@code
go
instead of 触发器创建完成下面开始触发:
delete from INFO where name ='胡军'
此时删除了三个表中p001的行
D、删除触发器:
drop trigger TR_INFO_DELETE
SQL--存储过程+触发器 对比!的更多相关文章
- SQL 存储过程 触发器 事务
一.存储过程 存储过程:就像函数一样的会保存在:数据库中-->可编程性 --> 存储过程 创建存储过程:create proc JiaFa --存储关键字proc @a int, ...
- SQL Server T—SQL 存储过程 触发器
一.存储过程 存储过程是一组编译在单个执行计划中的T-SQL语句 存储过程:就像函数一样的会保存在数据库中(可编程性) 存储过程的优点: 1.允许模块化程序设计 2.允许更快执行如果某操作需要大量T- ...
- SQL存储过程概念剖析
一.SQL存储过程的概念,优点及语法 定义:将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execut ...
- mysql与sql server参照对比学习mysql
mysql与sql server参照对比学习mysql 关键词:mysql语法.mysql基础 转自桦仔系列:http://www.cnblogs.com/lyhabc/p/3691555.html ...
- PL/SQL存储过程编程
PL/SQL存储过程编程 /**author huangchaobiao *Email:huangchaobiao111@163.com */ PL/SQL存储过程编程(上) 1. Oracle应用编 ...
- SQL 存储过程入门(事务)(四)
SQL 存储过程入门(事务)(四) 本篇我们来讲一下事务处理技术. 为什么要使用事务呢,事务有什么用呢,举个例子. 假设我们现在有个业务,当做成功某件事情的时候要向2张表中插入数据,A表,B表,我 ...
- 15、SQL Server 触发器
SQL Server 触发器 触发器是一种特殊的存储过程,只有当试图用数据操作语言DML来修改数据时才会触发,DML包含对视图和表的增.删.改. 触发器分为DML触发器和DDL触发器,其中DML触发器 ...
- (转)SQL Server 触发器
SQL Server 触发器 触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 ...
- SQL存储过程和函数
SQL存储过程: 由来:在具体应用中,一个完整的操作会包含多条SQL语句,在执行过程中需要根据前面SQL语句的执行结果有选择的执行后面的SQL语句.因此,mysql提供了数据库对象存储过程和函数. 定 ...
随机推荐
- C#利用lambda实现委托事件的挂接
转自:http://www.cdtarena.com/cpx/201307/9287.html在写一个小程序的时候,碰到了这样的问题,需要用委托来挂接事件,但是又想在这事件中使用局部的变量,而委托一旦 ...
- 【COCOS2D-HTML5 开发之三】演示样例项目附源代码及执行的GIF效果图
本站文章均为李华明Himi原创,转载务必在明显处注明:(作者新浪微博:@李华明Himi) 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/cocos2d- ...
- css概述
前言 1.CSS cascading stylesheet 级联样式表 ,外观显示(页面内容显示的方式).CSS文档以.css作为后缀 2.w3c推荐页面文件定义 数据和结 ...
- java class生成jar包(转)
进入dos操作符窗口cd进入要打成jar包的class文件所有文件夹目录jar cvf [生成jar的名称.jar] [列出class文件] //若有多个,以空隔隔开 如:一.操作零散的单个或几个cl ...
- perl 使用SUPER类来访问覆盖的方法
有时候,你希望一个衍生类的方法表现得象基类中的某些方法的封装器 这就是 SUPER 伪类提供便利的地方.它令你能够调用一个覆盖了的基类方法,而不用声明 是哪个类定义了该方 法.(注:不要把这个和第十一 ...
- Session for Tornado(Redis) - 代码分享
Session for Tornado(Redis) - 代码分享 Session for Tornado(Redis) session id的生成借用了web.py. 使用了 redis 的 h ...
- if(男深圳集体户口&&女非深圳户口)深圳准生证办理材料及流程
所需材料 一.女方需要办理流动人口婚育证明(蓝色的小本本). 办理材料.各地可能不同.这个是在女方的户籍所在地办理(最好在女方户籍所在地办理女方初婚未育证明). 二.男方在公司开出初婚未育证明. 三. ...
- 第二代map-reduce架构YARN解析
需求 我们在考虑hadoop map-reduce框架的时候,最重要需包括: 1. reliability 可靠性,主要是jobtracker,resource manager可靠性 2. avail ...
- 【SICP感应】3
级数据和符号数据
在本书的第二章学习时,有一个问题我一直很困扰,那是2.2.4举例节.因为没有华丽的输出模式书,它只能有一个对的英文字母.两三个月的这浅浅的学校前Common Lisp同样是真实的,当.了非常赞的线条, ...
- Eclipse更改默认工作目录的方法
参考: Eclipse更改默认工作目录的方法:http://blog.163.com/take_make/blog/static/208212210201272611406227/ 用记事本打开&qu ...