一、存储过程
存储过程是一组编译在单个执行计划中的T-SQL语句
存储过程:就像函数一样的会保存在数据库中(可编程性)
存储过程的优点:
1、允许模块化程序设计
2、允许更快执行如果某操作需要大量T-SQL代码或需要重复执行,存储过程将比T-SQL批代码的执行要快。将在创建存储过程时对其进行分析和优化,并可以在首次执行该过程后使用该过程的内存中版本。
3、减少网络流量
4、一个需要数百行T-SQL代码的操作由一条执行过程代码的单独语句就可实现,而不需要在网络中发送数百行代码。
5、作为安全机制使用
创建
create proc 存储过程名 -- 不需要写返回参数类型
参数
as -- as 后面写和函数体,只有开始没有结束
函数体
return 值
列:
create proc JiaFa @a int; @b int; as declare @c int; select @c = @a + @b; return @c
调用
exec 存储过程名
例:
declare @f int; exec @f = JiaFa 3,5; print @f;
二 触发器
是一类特殊的存储过程,在对表update,insert或delete语句时来触发它, 没有参数,没有返回值;
一个表的一个动作只能有一个触发器
1 创建
create trigger 触发名称 --命名规范 表名_动作
on 表名 --针对于哪一个表
for 动作 --针对于哪一个动作来触发
as
触发器内容
for 触发器
在动作执行之后触发(增删改执行完成后,触发器中的代码再执行)
instead of触发器
替代触发操作执行,写了这个之后,写的执行代码就没有用了,就被触发器的代码覆盖了
例:
create triggre users_delete on users for delete as select * from usere
create trigger users_delete on users instead of delete as select * from deleted --每次执行删除命令时打印要删除的那一个
deleted -- delete的过去式,要删除的那一个。只能用在触发器中
2 级联删除
触发器最根本最基础最常见的用法
create trigger class_delete
on class
instead of delete
as -- 要删除class表数据,class 表被 users 表外键约束,那么需要级联删除
declare @sno varchar(20);
select @sno = sno from deleted --deleted固定格式,为删除执行所要删除的数据,这里并没有执行删除,而是把他们显示出来
在这里获得要删除的数据的 键值,然后先删除其他表中此 键值 对应的数据
delete from score where sno = @sno;
delete from student where sno = @sno;