一、事务管理

单个工作单元称为事务,我们将若干条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之存储管理的更多相关文章

  1. Javaweb学习笔记——(十五)—————— sql复习

    sql复习 数据库管理系统(DBMS)的概述 1.什么是DBMS:数据的仓库 *方便查询 *可存储的数据量大 *保证数据的完整.一致 *安全可靠 2.DBMS的发展:今天主流数据库为关系型数据库管理系 ...

  2. SQL 复习笔记 MSSQL篇

    苦逼得很,一下就失业了,只有好好复习,迎接下一份工作 MSSQL篇:     1.数据库表分为临时表和永久表.临时表又分为全局临时表和局部临时表         全局临时表:表名以##开头.对系统当前 ...

  3. SQL复习

    1.select SELECT LastName,FirstName FROM Persons SELECT * FROM Persons 2.distinct SELECT DISTINCT Com ...

  4. SQL查询(医疗项目的SQL复习)

    内容来自于

  5. SQL复习五(索引)

    SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱. 1.1 什么是索引? SQL索引有两种,聚集索引和非聚集索引 ...

  6. SQL复习一(基础知识)

    1.什么是sql SQL(structure query language)是结构化查询语言,它是对关系型数据库的操作语言.它可以应用到所有的数据库中,例如:MySQL.Oracle.SQL serv ...

  7. sql 复习练习

          一.基础1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql server--- ...

  8. 关系数据库SQL复习

    1.1 SQL的概述 SQL(Structured Query Language)结构化查询语言,是关系数据库的标准语言 SQL是一个通用的.功能极强的关系数据库语言 1.2 SQL的特点 1. 综合 ...

  9. Oracle sql 复习题目总结

    sql 题目一 表结构 1.表名:g_cardapply 字段(字段名/类型/长度): apply_no varchar8; //申请单号(关键字) apply_date date; //申请日期 s ...

随机推荐

  1. 现代互联网的TCP拥塞控制(CC)算法评谈

    动机 写这篇文章本质上的动机是因为前天发了一个朋友圈,见最后的写在最后,但实际上,我早就想总结总结TCP拥塞控制算法点点滴滴了,上周总结了一张图,这周接着那些,写点文字. 前些天,Linux中国微信公 ...

  2. linux系统初始化——启动脚本是如何工作的

    启动脚本是如何工作的 Linux 使用的是基于 运行级(run-levels) 概念的称为 SysVinit 的专用启动工具.它在不同的系统上可能是完全不一样的,所以不能认为一个脚本在某个 Linux ...

  3. PowerDesigner数据模型(CDM—PDM—SQL脚本的转换流程)

    原文地址:PowerDesigner数据模型(CDM-PDM-SQL脚本的转换流程)作者:zzenglish 有图片的参考http://blog.sina.com.cn/s/blog_64742675 ...

  4. set基本用法---1

    #include<cstdio> #include<iostream> #include<cstdlib> #include<cmath> #inclu ...

  5. MySQL命令行导入脚本文件

    通过命令行执行sql脚本文件的方法: cmd命令行下: C:\users\test_dir>"C:\Program Files\MySQL\MySQL Server 5.7\bin\m ...

  6. 多线程中sleep和wait的区别

    前几天去UC笔试,有一道简答题问到了.之前还真一直没留意到这个问题,所以答得也不好. 无论学习什么都好,通过对比学习更有利于发现事物的共性和个性,对于知识点的理解更有明显效果(这也可能是UC笔试题上, ...

  7. Linux和Cisco命令行通用快捷键。

    Ctrl a e 行首,行尾(ahead,end)Esc f b 单词首,单词尾Ctrl f b 移动光标(forward,backwards) Ctrl u k 剪切光标前所有,剪切光标后所有Ctr ...

  8. 关联分析(Apriori算法)

    两个概念: 频繁项集:常出现的物品集合 关联分析:找到诸如:尿布-->啤酒的关联,反过来则是另一条 两个控制参数: 项集的支持度(support):一个项集出现的次数在所有样本中出现的比例 可信 ...

  9. HDU 5997 rausen loves cakes(启发式合并 + 树状数组统计答案)

    题目链接  rausen loves cakes 题意  给出一个序列和若干次修改和查询.修改为把序列中所有颜色为$x$的修改为$y$, 查询为询问当前$[x, y]$对应的区间中有多少连续颜色段. ...

  10. JMeter性能测试常用之事务控制器实例

    通常进行性能测试时,我们一般仅考虑主要的数据返回,不考虑页面渲染所需要的数据(例如:css.js.图片等).但当我们需要衡量打开一个页面(页面渲染完成)的性能时,我们就需要考虑完成页面渲染所需要的图片 ...