SQL Server 触发器例题: --次性删除course表数据,使用触发器替换删除操作,先删除外键表相关数据,再删除course。很难理解
create trigger Course_Delete on course instead of delete as declare @cno varchar(20) --定义变量 select @cno = cno from deleted --临时表里的信息是instead of 替换 delete要删除的信息 delete from score where cno = @cno --instead of 替换操作后执行的代码命令 delete from course where cno=@cno go delete from course where cno=‘3-245‘---‘3-245‘为输入的参数 select *from score select *from course --上面的这个触发器存储过程只能删除一条一条的信息 drop trigger course_delete create trigger Course_Delete on course instead of delete as delete from score where cno in (select cno from deleted) delete from course where cno in (select cno from deleted) go delete from score where cno=‘3-105‘ select*from course select*from score --这个触发器可以删除多条信息 --次性删除course表数据,使用触发器替换删除操作,先删除外键表相关数据,再删除course --删除前先备份数据到备份表之后再删除 drop trigger score_delete drop table scorebak create table scorebak --建一个备份表 ( ids int identity(1,1) primary key , sno char(3), cno char(5), degree decimal(4,1), datetimes datetime ) create trigger Score_delete --建一个触发器的存储过程 on score --在成绩表里 instead of delete --把declete *from course 命令替换掉然后执行触发器存储过程 as declare @count int --定义一个变量 select @count=count(*) from deleted --把临时表里的行数赋给@count 这个变量。被删除的这个表里的信息都在deleted这个临时表里。 --把表里的行数付给变量 declare @i int --再定义一个变量 set @i=0 --for(i=0;i<count;i++) while @i<@count --循环遍历deleted临时表的数据,然后转移 begin declare @sno varchar(20) --定义临时表的三个变量 declare @cno varchar(20) declare @degree decimal(4,1) select top 1 @sno=sno,@cno=cno,@degree=degree from deleted --显示临时表的前一行 where sno not in (select top (@i) sno from deleted) -- 如果@i是2的时候,去除前两页,显示第一页 or cno not in (select top (@i) cno from deleted ) -- or degree not in(select top(@i) degree from deleted) insert into scorebak values(@sno,@cno,@degree,getdate()) --向临时表中插入数据 delete from score where sno=@sno and cno=@cno --每向临时表中插入一条数据,就把score表里的数据删除一条 --因为是要删除course表,而course表是主键,所以要删除外键score表的信息,而score表的信息并没有被要求删除, -- 所要要建一个临时表,把score表里信息添进去 set @i=@i+1 --相当于i++ end go delete from score select*from scorebak drop trigger score_delete select *from score select*from course insert into score values(1,‘3-105‘,79) insert into score values(2,‘3-105‘,79) insert into score values(3,‘3-105‘,79) insert into score values(4,‘3-105‘,79) insert into score values(5,‘3-105‘,79) insert into score values(6,‘3-105‘,79)
--事务:保障整个流程的完整执行,全部没有问题,统一提交,一旦有问题,回到原点.比如银行转账.
begin tran --z事务的开始 --开始写流程语句 --语句写完之后
if @@ERROR>0
rollback tran--回滚事务
else
commit tran--ti提交事务
begin tran
insert into scorebak values(@sno,@cno,@degree,getdate()) --保证这两句话的正确执行
delete from score where sno=@sno and cno=@cno
if @@ERROR>0
begin
rollback tran
end
else
begin
commit tran
end
--数据库设计:范式理论
1、每一列里的数据必须单一
2、一个表必须有主键
3、外键表中只出现主键表中的主键列就好,其他的就不要出现。
当一个表中出现3列及以上的数据经常重复出现多次情况的时候,就需要把这些列拿出来单独建立一个表,设一个主键,然后 在原来表中只要出现主键就可以了。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。