SQL SERVER-10-触发器|游标|动态sql

本文深入探讨SQL Server中的触发器与游标应用。详细介绍了DML与DDL触发器的工作原理,包括inserted和deleted特殊表的作用,以及如何通过触发器在数据变更时进行备份。同时,讲解了游标的使用方法及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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'

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值