1.触发器
--可以理解为一个特殊的存储过程,在某一个动作执行的时候,自动执行,而不需要人手动执行
--触发器的分类
--1.DML触发器
--insert,delete,update(不支持select)
--after触发器,instead of 触发器(相当于其他数据库的before触发器,是一个替代),(不支持before触发器)
--2.DDL触发器
--create table,create database,alter,drop
--两张特殊的表,inserted表和deleted表
--可以把这两张表看做临时表
--inserted表,insert和update触发器会用到
--deleted表,delete和update触发器会用到
--在insert的时候,先在数据表和inserted表中都插入数据,在提交之后,数据表数据保存,inserted表中数据销毁
--在delete的时候,先把数据表中要删除的数据移动到deleted表中,然后删除数据表表中信息,提交之后销毁deleted表中的数据
--在update的时候,先把数据表中要修改的数据放到deleted表中,然后删除原数据,再把新的数据保存到inserted表中和数据表中,提交之后销毁inserted和deleted表中数据
--sql server没有行级触发器,只有表级触发器
--如果一条sql语句删除了多行记录,只会触发一次触发器
--操作,创建触发器在删除数据的时候对删除数据进行备份
select * from TblPerson
--为TblPerson表编写一个触发器,当删除该表中的记录的时候,把删除的记录备份到一个备份表中
--TblPersonBakTable
--1.先创建一个没有数据的用来备份的表
select top 0 * into TblPersonBakTable from TblPerson
--创建备份表之后查询一下看看是否成功和是否有数据
select * from TblPersonBakTable
--2.创建删除触发器
create trigger tri_delete_TblPerson on TblPerson
for delete --类型为删除触发器,这里的for也可以换成after,他们都表示after触发器
as
begin
--把已经删除的记录备份到另一个表中
--1.如何获得那些已经删除的数据??
--select * from deleted
--2.把这些已经删除的数据备份到一个新表中
insert into TblPersonBakTable
select uname,uage,uheight from deleted
--1.打开事务之后,执行删除语句,把需要删除的数据保存到inserted表中
--2.删除数据表中的数据
--3.触发器执行
--4.提交commit
--如果这里执行roolback,则删除的事务会被回滚,删除不再继续
--roolback
end
--如果想要一个触发器在执行增删改的时候都触发,只需要在for后面跟上需要执行的操作即可
--create trigger tri_delete_TblPerson on TblPerson
--for delete,insert,update --执行增,删,改都会触发该触发器
--as
--begin
-- --把已经删除的记录备份到另一个表中
-- --1.如何获得那些已经删除的数据??
-- --select * from deleted
-- --2.把这些已经删除的数据备份到一个新表中
-- insert into TblPersonBakTable
-- select uname,uage,uheight from deleted
--end
--删除触发器
--drop trigger tri_delete_TblPerson
2.游标
--游标的性能很低,所以一般情况下不要用游标
select * from NIS_ADDINS
--1.创建游标
--fast_forward,是向前的只读游标,只能前进不能倒退,所以是游标中最快的
--scroll,表示可以随意移动的游标,能前进也能后退
declare cs_addins cursor fast_forward for
--查询需要操作的数据
select ID,ZYMC FROM NIS_ADDINS
--定义两个变量用来接收循环的信息
declare @id varchar(64)
,@zymc varchar(64)
--2.打开游标
open cs_addins
--3.操作游标
--向后移动一条,为变量赋值初始值
fetch next from cs_addins into @id,@zymc
--判断移动是否成功
while @@FETCH_STATUS=0
begin
print @id+'/'+@zymc
--操作下一条数据
fetch next from cs_addins into @id,@zymc
end
--4.关闭游标
close cs_addins
--5.释放资源
deallocate cs_addins
3.动态sql
--存储过程动态拼接需要执行的sql语句
--比如想要分页查询,这里可以传入表名称,实现一个存储过程就能实现所有的表的分页查询
create proc usp_testpp
@tbName varchar(50)
as
begin
declare @sql nvarchar(500)
set @sql='select * from '+@tbName
exec(@sql)
--exec sp_executesql()
end
--执行存储过程
exec usp_testpp 'TblStudent'