Sql 复习3之存储管理
一、事务管理
单个工作单元称为事务,我们将若干条sql命令组合在一起,形成存储过程、触发器等,利用存储过程和触发器可以进行事务管理。
二、编程基础介绍
主要有:函数、程序设计语句等。
程序设计语句:
1、begin ......end 中间插入若干条sql语句,我们将其视为一个单元。
2、跳转语句(goto语句):
goto语句可以使程序跳到带有标识符的指定位置继续执行。
3、条件分支语句(if --- else):
--利用条件分支语句和跳转语句求出1到5之和并输出
declare @sum int,@count int
select @sum=0,@count=1
label_1:
if @count<=5
begin
select @sum = @sum + @count
select @count = @count + 1
goto label_1
end
else
select @count,@sum
4、循环语句(while ..... continue .....break)
-- 求出1到5之和并输出
declare @sum int, @count int
select @sum=0, @count=1
while (@count<=5)
begin
select @sum = @sum + @count
select @count += 1
end
select @count,@sum
5、打印输出语句(print 语句)
print 字符串|@局部变量|@@全局变量
declare @sum int, @count int
select @sum = 0, @count = 1
while(@count <= 5)
begin
select @sum += @count
select @count += 1
end
print '1到5的总和是:'
print @sum
6、终止语句(return 语句)
return 无条件终止
7、注释语句
-- 单条语句的注释
/* */ 多条语句的注释
三、事务
事务(transation)是一个工作单元。通过事务能将逻辑相关的操作绑定在一起,保持数据的完整性。而且,这些逻辑相关的操作是同生共死的关系,必须一起执行。
如果将若干条sql 命令作为一个事务,可通过下面的语句进行定义。
begin (transation|tran)
sql 语句组
commit (transation|tran)
一个是事务的开始,一个是事务的结束。
rollback (transation|tran) [保持点名称] 在commit tran之前使用回滚机制,可以取消事务并撤销对数据所做的任何改变。
save tran[sation] 保存点名称
begin transation
insert into department values(2,'销售部')
save tran A
insert into department values(3,'市场部')
rollback tran A
insert into department values(5,'人力资源')
commit
上面用save tran 定义保存点,rollback tran A 作用将第二条insert 操作从数据库撤销
四、存储过程:
指的是将一些固定的操作集中起来,有sql服务器来完成,以实现某个任务,这种方法就是存储过程。存储过程
是一套已经编译好的sql语句,允许用户声明变量、输出参数、返回单个或者多个结果集以及返回值。存储过程存在于数据库中,可由应用程序调用执行。
一些系统存储过程:比如 sp_helptext sp_rename 等。当然也有一些用户自定义的存储过程。
create proc[edure] 过程名 [@参数名 参数类型[=默认值][output]....] as sql 语句组
执行存储过程的语法:
exec(ute) 过程名 [[@参数名=][参数][默认值][output].....]
exec 具有编辑权限的人
--带参数的存储过程,我们执行的时候可以有两种赋值方式
--其中 + 作为字符串的连接符出现。
create proc 权限查询
(@permit varchar(20))
as
select *
from mag_dept
where permitstr like '%' + @permit + '%'
exec 权限查询 '核稿'
exec 权限查询 '定稿'
事例:建立一个名为人员职务的存储过程,查询某雇员的职务情况,并把查询的结果以输出参数的形式返回。
其中存储过程的输入参数是雇员姓名,以@emp_name表示。声明输出参数@role保存职务信息,参数类型必须以存储过程定义时的输出参数类型一致。
create proc 人员职务
(@emp_name varchar(30)='', @role varchar(20) output)
as
select @role=emprole
from mag_dept
where empname=@emp_name
return
declare @emprole varchar(20)
exec 人员职务 @emp_name='赵华'
@role = @emprole output
select @emprole as 职务
修改存储过程:
将create换成alter就是修改存储过程。
事例:修改存储过程 权限查询 ,增加统计出满足条件的雇员的人数
alter proc 权限查询
(@permit varchar(20))
as
select *
from mag_dept
where permitstr like '%' + @permit + '%'
select count(*) as 人数
from mag_emp
where permitstr like '%' + @permit + '%'
exec 权限查询 '签发'
删除存储过程
drop proc 权限查询
存储过程与事务管理
为了避免事务分散,我们一般讲事务写入到存储过程中,存储过程执行中,服务器会捕捉错误信息,这样有助于在存储过程中管理事务嵌套。
--编辑存储过程期刊编辑,保证在期刊采集系统数据库中对 mag_info表增加一个新纪录时完成日期要早于出版日期。
--其中,begin -- end 相当于 {} 大括号。
create proc 期刊编辑
(@magid char(9), @magname varchar(50), @pubdate datetime, @depid int,
@designername varchar(30), @finishdate datetime )
as
begin tran
insert into mag_info values
(@magid,@magname,@pubdate,@depid,@designername,@finishdate)
if @pubdate > @finishdate
begin
commit tran
return 0
end
else
begin
rollback tran
return 9999
end
-- 执行
declare @status int
exec @status='期刊编辑' 'baxddd','北京信息周报','2007-4-2','2','张斌','2004-3-30 15:00'
select @status
触发器
触发器是定义在表上面的一个对象,是一种特殊的存储过程。触发器不需要专门语句去调用,它主要是通过事件进行触发而被执行的,即当执行 insert delete update 时,语句自动触发,而存储过程可以通过存储过程名称而被直接调用。其可以用于约束,默认值和规则的完整性检查。
创建和执行触发器:
create trigger 触发器名
on 表名
for{[detete],[insert],[update]}
as sql语句组
注意:触发器可以引用当前数据库以外的对象,但只能在当前数据库中创建触发器。也就是说,触发器可以引用临时表对象。
--建立约束
--创建 更新部门 触发器来保证期刊采集系统数据库中 mag_dept表中部门负责人与mag_emp表中的部门信息的参照完整性
--语句流程:
--从inserted表中获取部门编号与负责人姓名,分别保存在变量@depid 与@manager中。
--查询出该负责人在mag_emp中所在的depid,并判断是否与变量@depid一致,如果不一致,将负责人@manager在mag_emp
--中的depid修改为@depid。
create trigger 更新部门
on mag_dept for update
as
declare @depid int
declare @manager varchar(50)
select @depid=Depid,@manager = Depmanager
from inserted
if(@depid <> (select Depid from mag_emp where Empname=@manager))
update mag_dept set Depid = @depid
where empname = @manager
--使用
update mag_dept
set Depmanager = '王玲玲' , DepTel='1111111'
where Depid = 3
--查看
select Empname, Depid
from mag_emp
where Empname='王玲玲'
修改触发器
alter trigger 更新部门
on mag_dept for update
as
declare @depid int
declare @manager varchar(50)
select @depid=Depid,@manager = Depmanager
from inserted
if(@depid <> (select Depid from mag_emp where Empname=@manager))
update mag_dept set Depid = @depid
where empname = @manager
print '更新成功'
删除触发器
drop trigger 更新部门
触发器与事务管理
触发器最常用的应用就是执行复杂的行验证,保证数据的完整性。如果触发器能够确定激发触发器的命令是无效的,它就可以回滚此事务。
create trigger 增加期刊
on mag_info for insert
as
declare @magid char(9)
declare @num tinyint
select @magid=Magid from inserted
select @num=count(*) from mag_info
where Magid=@magid
if @num >0
begin -- sql语句有多条,所以用begin end 语句。
rollback tran
print '期刊号不唯一'
end
整理代码如下:




Sql 复习3之存储管理的更多相关文章
- Javaweb学习笔记——(十五)—————— sql复习
sql复习 数据库管理系统(DBMS)的概述 1.什么是DBMS:数据的仓库 *方便查询 *可存储的数据量大 *保证数据的完整.一致 *安全可靠 2.DBMS的发展:今天主流数据库为关系型数据库管理系 ...
- SQL 复习笔记 MSSQL篇
苦逼得很,一下就失业了,只有好好复习,迎接下一份工作 MSSQL篇: 1.数据库表分为临时表和永久表.临时表又分为全局临时表和局部临时表 全局临时表:表名以##开头.对系统当前 ...
- SQL复习
1.select SELECT LastName,FirstName FROM Persons SELECT * FROM Persons 2.distinct SELECT DISTINCT Com ...
- SQL查询(医疗项目的SQL复习)
内容来自于
- SQL复习五(索引)
SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱. 1.1 什么是索引? SQL索引有两种,聚集索引和非聚集索引 ...
- SQL复习一(基础知识)
1.什么是sql SQL(structure query language)是结构化查询语言,它是对关系型数据库的操作语言.它可以应用到所有的数据库中,例如:MySQL.Oracle.SQL serv ...
- sql 复习练习
一.基础1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql server--- ...
- 关系数据库SQL复习
1.1 SQL的概述 SQL(Structured Query Language)结构化查询语言,是关系数据库的标准语言 SQL是一个通用的.功能极强的关系数据库语言 1.2 SQL的特点 1. 综合 ...
- Oracle sql 复习题目总结
sql 题目一 表结构 1.表名:g_cardapply 字段(字段名/类型/长度): apply_no varchar8; //申请单号(关键字) apply_date date; //申请日期 s ...
随机推荐
- linux下编译lua库
编辑MakeFile INSTALL_TOP= /usr/local修改为目标install位置 执行 make linux make install 如果提示依赖libreadline 可以直接a ...
- HDU 2036 求任意多边形面积向量叉乘
三角形的面积可以使用向量的叉积来求: 对于 三角形的面积 等于: [(x2 - x1)*(y3 - y1)- ( y2 - y1 ) * ( x3 - x1 ) ] / 2.0 但是面积是有方向的, ...
- 论S B的自我修养 【2015/10/18更】
to do list: 1.正则表达式引擎 (done 2.五子棋AI jquery && canvas 游戏 (这个搞定好多好玩的idea可以实现了php 暂时不想玩各种框架吧, ...
- BZOJ1801 [Ahoi2009]chess 中国象棋 【dp】
题目 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. 输入格式 一行包含两个整数N,M,中间用空格分开. ...
- Javascript&Html-location对象
Javascript&Html-location对象 location对应是BOM最有用的对象之一,她提供了当前窗口中加载的文档的信息,并提供了一些导航的功能.location对象有一个特别的 ...
- Use Razor for Email Template outside ASP.NET MVC
原文发布时间为:2011-09-15 -- 来源于本人的百度文章 [由搬家工具导入] http://kazimanzurrashid.com/posts/use-razor-for-email-tem ...
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---53
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:
- hdu 1395(欧拉函数)
2^x mod n = 1 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- 转载——C# 6.0可能的新特性及C#发展历程
据扯,C# 6.0在不远的将来就发布了,对应的IDE可能是VS 2014(.Net Framework 5.0),因为VS 2013已于2013年10月份发布了,对应的是.Net Franework ...
- Codeforces Gym100814 F.Geometry (ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (2015) Arab Academy for Science and Technology)
这个题真的是超级超级水啊,哈哈哈哈哈哈.不要被题面吓到,emnnn,就这样... 代码: 1 #include<iostream> 2 #include<cstring> 3 ...