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 [email protected] and [email protected]

if @@ERROR>0

begin

rollback tran

end

else

begin

commit tran

end

--数据库设计:范式理论

1、每一列里的数据必须单一

2、一个表必须有主键

3、外键表中只出现主键表中的主键列就好,其他的就不要出现。

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

时间: 2024-08-05 22:13:07

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

SQL Server 2012设置某用户对某些表的记录限制其删除操作

第一步:用sa用户进入SSMS: 第二步:在安全性---用户上面点击右键---"属性": 第三步:在选择页中选择"安全对象",点击"搜索",弹出添加对象页面,这里默认为特定对象不用选择: 第四步:点击对象类型对话框,打开选择对象类型,选择"表": 第五步:对要进行加权限限制的表进行选择: 第六步:对所选择的表进行授权设置,点击完成即可.我这里主要是限制不可以删除,选择相应的表,勾选删除即可. SQL Server 2012设置

SQL Server 2008 阻止保存要求重新创建表的更改问题的设置方法

不是很理解为什么在2008中会加入阻止保存要求重新创建表的更改这个选项.症状表现为修改表结构的时候会"阻止"你.而且我遇到的情况是居然有的时候阻止你,有的时候不阻止你,摸不到头脑.SQL Server 2008“阻止保存要求重新创建表的更改”的错误的解决方案是本文我们主要要介绍的内容,情况是这样的:我们在用SQL Server 2008 建完表后,插入或修改任意列时,提示:当用户在在SQL Server 2008企业管理器中更改表结构时,必须要先删除原来的表,然后重新创建新表,才能完成

SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段

一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段: 方法二:使用拼接SQL,动态列字段: 方法三:使用PIVOT关系运算符,静态列字段: 方法四:使用PIVOT关系运算符,动态列字段: 扩展阅读一:参数化表名.分组列.行转列字段.字段值: 扩展阅读二:在前面的基础上加入条件过滤: 参考文献(References) 二.背景(Contexts) 其实行转列并不是一个什么新鲜的

Sql Server有主外键关系时添加、删除数据

当表之间有主外键关系时删除数据会被约束,添加.删除失败 解决办法,我们可以先把主外键关系的检查约束给关掉 → 然后删除数据 → 之后再把约束打开 查询出关掉所有外键约束的语句 SELECT 'ALTER TABLE ' + O.NAME + ' NOCHECK CONSTRAINT [' + F.NAME + '];' AS COMMAND FROM SYS.FOREIGN_KEYS F INNER JOIN SYS.ALL_OBJECTS O ON F.PARENT_OBJECT_ID = O

SQL Server 2012 “阻止保存要求重新创建表”的更改问题的设置方法

我们在用SQL Server 2012 建完表后,插入或修改任意列时,提示:当用户在在SQL Server 2012企业管理器中更改表结构时,必须要先删除原来的表,然后重新创建新表,才能完成表的更改. 如果强行更改会出现以下提示:"不允许保存更改.您所做的更改要求删除并重新创建以下表.您对无法重新创建的标进行了更改或者启用了"阻止保存要求重新创建表的更改"选项".如下图: 解决方法: 工具-〉选项-〉左侧有个 设计器-〉表设计器和数据库设计器 -> 阻止保存要

SQL Server 2014与TFS 2013的错误(TF53001:管理员已取消数据库操作)

服务器环境: - TFS 2013 with Update 2 - SQL Server 2014(两个节点数据库服务器配置了AlwaysOn高可用性) - Windows Server 2012 R2 昨天,我们在协助项目组成员导入源代码时,发现导入源代码过程中出现错误提示(错误编号TF53001,如下图). Figure 1 – 不能通过Visual Studio/Eclipse下载和更新源代码 随后我们马上排查问题,发现所有开发人员都不能下载和签入源代码,但工作项(网页)可以正常工作,可以

Sql Server 导入还有一个数据库中的表数据

在涉及到SQL Server编程或是管理时一定会用到数据的导入与导出, 导入导出的方法有多种,此处以SQL Server导入表数据为例.阐述一下: 1.打开SQL Server Management Studio.在对象资源管理器中,展开"SQL Server 实例"→"数据库"→"你须要导入数据的数据库"节点.单击鼠标右键,选择"任务"→"导出数据"命令. 出现导入和导出向导的欢迎界面,单击"下

Sql Server 导入另一个数据库中的表数据

在涉及到SQL Server编程或是管理时一定会用到数据的导入与导出, 导入导出的方法有多种,此处以SQL Server导入表数据为例,阐述一下: 1.打开SQL Server Management Studio,在对象资源管理器中,展开"SQL Server 实例"→"数据库"→"你需要导入数据的数据库"节点,单击鼠标右键,选择"任务"→"导出数据"命令.出现导入和导出向导的欢迎界面,单击"下一

部署到Sql Server的package,可以通过SSISDB 提供的API来查询和操作

使用Project Deployment Model部署到Sql Server之后,SSISDB负责管理这个Project, 参考文档URL:Integration Services Language Reference https://msdn.microsoft.com/en-us/library/dn198335.aspx This section describes the Transact-SQL API for administering Integration Services p