好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SQL Server 触发器例题: --次性删除course表数据,使用触发器替换删除操作,先删除外

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列及以上的数据经常重复出现多次情况的时候,就需要把这些列拿出来单独建立一个表,设一个主键,然后   在原来表中只要出现主键就可以了。

 

 

 

SQL Server 触发器例题: --次性删除course表数据,使用触发器替换删除操作,先删除外键表相关数据,再删除course。很难理解

标签:

查看更多关于SQL Server 触发器例题: --次性删除course表数据,使用触发器替换删除操作,先删除外的详细内容...

  阅读:36次