存储过程和触发器

存储过程

存储过程是为了实现某个特定任务的一组T-SQL语句的集合,他在一个名称下存储,按独立单元方式执行

  • 存储过程是预编译过的,执行速度快
  • 可以多次调用,避免重写多条T-SQL语句
  • 可以作为一个独立的数据库对象,也可作为一个单元供用户在应用程序中调用
  • 可以接受和输出数据,也可以嵌套调用
  • 可以减少开发者在客户端的程序代码编写量,降低客户机和服务器之间的通信量,提高数据库安全性。
    建立一个统计显示每门课选课人数的存储过程
create procedure sc_cno_number
as
select cno,count(sno)as 人数
from sc
group by cno

查看存储过程

存储过程被创建之后,他的名字就存储在系统视图表sysobjects,他的源代码存放在系统视图表syscoments中,可以使用企业管理器或系统存储过程来查看用户创建的存储过程

  • 使用企业管理器查看存储过程
  • 使用系统存储过程

可供使用的系统存储过程及语法形式如下:
sp_help:用于显示存储过程的基本信息
sp_help ‘name’
参数name为要查看的存储过程的名称
sp_helptext:用于显示存储过程的源代码
sp_helptext ‘name’

执行存储过程

execute sc_cno_number

带参数的存储过程

建立一个统计B001课程选课人数的存储过程

create procedure sc_B001_number
as
select cno,count(sno)as 人数
from sc where cno='B001'
group by cno

带输入参数的存储过程

建立一个统计指定课程选课人数的存储过程

create procedure sc_cno_number @cnum char(10)
as
	select cno,count(sno)as 人数
	from sc
	where cno=@cnum
	group by cno

执行:

exec sc_cno_number1 'B001'
exec sc_cno_number1 'B008'

创建一个带有参数的简单过程,该存储过程现实某位同学的某门课课程成绩

create procedure getGrade @VSno char(10),@VCno char(5)
as
select sno,cno,grade from sc
where sno = @Vsno and cno = @VCno

delete触发器

create trigger trg4
on Course
Instead of delele
as
begin
	print 'Deletion of the course is not allowed'
	rollback transaction
end

触发器练习

创建触发器,在删除Student表中的一条学生记录时,该学生在SC表中相应记录也级联删除

create trigger trg on student after delete
as
delete from sc where sno in
						(select sno from deleted)

只有当SC表不存在对Student表的外键约束才可以行
创建触发器,在删除Student表中的一条学生记录时,该学生SC表中的相应记录也删除

create trigger on student instead of delete
as
begin
	delete from sc where sno in(select sno from deleted)
	delete from student where sno in(select sno from deleted)
end

在delete数据的时候,可以假定数据库将要删除的数据存放到一个deleted临时表中,我们可以像读取普通的表一样,select 字段 from deleted。而insert的道理一样,只不过是要把插入的数据放在inserted表中
更新操作可以认为是执行了两个操作,先把哪一行记录delete掉,然后在insert。这样update操作实际上就对deleted表和inserted表的操作,所以不会有updated表了

管理触发器

触发器的特征:

  • 当任何数据修改语句被发出时,就被SQL Server自动的激发
  • 他防止了对数据的不正确、未授权的和不一致的改变,他不能返回数据给用户
  • 结果:触发器可以用来加强维持数据完整性

你可能感兴趣的:(数据库,sql,服务器)