目录

  • 第1单元    数据库系统导论
    • ● 任务1.1  数据库基本概念
    • ● 任务1.2  设计E—R 图
    • ● 任务1.3   将E-R图转换成关系模型
    • ● 任务1.4   练习与作业
    • ● 教与学参考资源
  • 第2单元   认识SQL SERVER数据库
    • ● 任务2.1 数据库应用场景
    • ● 任务2.3  SQL  Server 数据库安装
    • ● 任务2.4 SQL Server 的管理
    • ● 任务2.5  使用SSMS连接数据库
    • ● 教与学参考资源
  • 第3单元  创建和管理数据库
    • ● 任务3.1 创建数据库
    • ● 任务3.1(2)  命令创建数据库
    • ● 任务3.2 管理数据库
    • ● 任务3.2(2) 查看、收缩数据库
    • ● 教与学参考资源
  • 第4单元 创建和管理数据库表
    • ● 任务4.1 SQL Server常用数据类型
    • ● 任务4.2  创建数据表
    • ● 任务4.3  命令创建表
    • ● 任务4.4 实施完整性约束
    • ● 教与学参考资源
  • 第 5 单元   查询数据表
    • ● 任务5.1 单表数据查询
    • ● 任务5.2 多表数据查询
    • ● 任务5.3 嵌套查询
    • ● 任务5.4 合并查询结果
    • ● 教与学参考资源
  • 第6单元  管理表中数据
    • ● 任务6.1   添加数据
    • ● 任务6.2  修改数据
    • ● 任务6.3  删除数据
    • ● 习题与训练
    • ● 教与学参考资源
  • 第7单元  使用索引和视图
    • ● 任务7.1  使用索引
    • ● 使用T-SQL创建索引
    • ● 任务7.2  使用视图
    • ● 使用T-SQL语句创建视图
    • ● 教与学参考资源
  • 第8单元 Transact-SQL语言编程
    • ● 任务8.1   声明和使用变量
    • ● 任务8.2   流控语句
    • ● 任务8.3   常用系统函数
    • ● 任务8.4   创建自定义函数
    • ● 教与学参考资源
  • 第9单元  事务和锁
    • ● 任务   9.1     事务
    • ● 事务的基本操作
    • ● 任务9.2    锁
    • ● 死锁及避免方法(例)
    • ● 教与学参考资源
  • 第10单元  创建和管理存储过程
    • ● 任务10.1 存储过程及优点
    • ● 任务10.2 创建和执行存储过程
    • ● 任务10.3   存储过程参数和返回值
    • ● 任务10.4 修改、删除、 重新编译存储过程
    • ● 教与学参考资源
  • 第11单元 创建和管理触发器
    • ● 任务1 触发器的作用和分类
    • ● 任务2 触 发器的创建与执行
    • ● 任务3 创建级联触发器
    • ● 任务4 修改、删除触发器
  • 第12单元 创建和使用游标
    • ● 任务1  游标的作用及使用步骤
    • ● 任务2  创建基本游标
    • ● 任务3  使用变量保存游标数据
    • ● 任务4  使用循环环提取游标数据
  • 第13单元 SQL Server用户管理
    • ● 任务1数据库安全管理概述
    • ● 任务2SQL Server 安全机制
    • ● 任务3 账号、角色及权限管理
    • ● 任务4数据库完整性管理
    • ● 任务5 数据库的备份与还原
    • ● 任务6   数据的导入与导出
  • 第14单元  综合应用案例
    • ● 概述
    • ● 需求分析
    • ● 概述设计-逻辑设计- 物理设计
    • ● 编写数据库设计说明书
  • 学生做项目成果展示
    • ● 项目一  设计《我班同学数据库》
    • ● 项目二  设计《(Teaching)教学数据库》
    • ● 项目三  数据库应用系统设计开发项目
    • ● 项目四 《华夏-宿舍管理系统》设计开发
    • ● 项目五   综合实训大作业
    • ● 综合实训团队项目大作业
    • ● 学生完成项目摘录展示
  • 总复习与综合训练
    • ● 总复习
    • ● 综合训练一
    • ● 综合训练二
    • ● 综合训练三
    • ● 综合训练四
    • ● 综合训练五
    • ● 简答综合训练
  • 在线专题测验
    • ● 自检自测一
    • ● 自检自测二
  • 拓展   数据库管理工具平台  Navicat
    • ● 关于Navica
    • ● Navicat 的系统需求
    • ● Navicat 的用户界面
    • ● Navicat 创建数据库对象
    • ● 在Navicat创建的SQL 程序脚本
    • ● 在Navicat创建的SQL  server 脚本(2)
    • ● 综合实训(1)
    • ● 综合实训(2)
  • 技术拓展   (MYSQL)数据库技术与应用
    • ● MYSQL技术
  • 教与学图片剪影
    • ● 教学团队
    • ● 学生学习实训
    • ● 活动与交流
任务3 创建级联触发器
任务3 创建级联触发器

示例:创建级联触发器。例,若修改表[A]的name,则级联也更新修改表[B]的name。

create  trigger tri_update_A
on   A
for   update
as
declare  @OLDname  char(10),@NEWname   char(10)
select  @OLDname=deleted.name , @NEWname=inserted.name
from  deleted,inserted
where   deleted.id=inserted.id
print  '准备级联更新B表中的name信息'
update  B
set  name=@NEWname
where  name=@OLDname


用触发器来实现级联更新级联删除

(参考范本)触发器方式:

createtrigger trg_A

on A

for update,delete

as

begin

if exists(select 1 from inserted)

update 

B set Name=(select Name from inserted) 

  where Name=(select Name from deleted)

else

delete B where Name=(select Name from deleted)

end

go


应用示例:

/*用触发器来实现级联更新级联删除*/

--创建数据库[教学管理]及学生表、课程表、成绩表

CREATE  DATABASE  [教学管理]

GO

USE  [教学管理]

GO

CREATE  TABLE [dbo].[学生表](

[学号] [nvarchar](50) primary key  NOT NULL,

[姓名] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,

)


CREATE  TABLE [dbo].[课程表](

[课程号] [nvarchar](50)  primary key  NOT NULL,

[课程名称] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,

)


CREATE  TABLE [dbo].[成绩](

[学号] [nvarchar](50) NOT NULL ,

[课程号] [nvarchar](50)  NOT NULL ,

[成绩] [nvarchar](50)  NULL,

   primary key(学号,课程号),

)


--删除表:

--drop table 学生表;

--drop table 课程表;

--droptable 成绩;


insert into 学生表 values('001','张三');

insert into 学生表  values('002','李四');

insert into 学生表  values('003','王五');


insert into 课程表 values('101','语文');

insert into 课程表 values('102','数学');

insert into 课程表 values('103','电脑');


insert  into 成绩 values('001','101','82');

insert into 成绩 values('001','102','56');

insert into 成绩 values('002','101','83');

insert into 成绩  values('002','102','77');

insert into 成绩 values('003','103','83');

insert into 成绩 values('003','102','93');



--创建一个触发器来实现级联更新、级联删除;

create  trigger trg_A

on 学生表

for update,delete

as

begin

if  exists(select 1 from inserted)

update  成绩  set 学号=(select 学号 from inserted) 

  where 学号=(select 学号 from deleted)

else

delete  成绩  where 学号=(select 学号 from deleted)

end

go


--删除操作,下面删除命令,将学号为001的学生信息在学生表删除,由于已建立级联触发器,成绩表的相关信息也自动被删除:

delete from 学生表  where 学号='001'

select * from 学生表  order  by  学号;

select * from 成绩  order  by  学号, 课程号;


--更新操作,将原学号为003的学生信息在学生表更新为201903,由于已建立级联触发器,成绩表的相关信息也自动被更新:

update  学生表  set 学号='201903' where 学号='003'

select * from 学生表  order  by  学号

select * from 成绩  order  by  学号, 课程号



分析问题并解决问题:

--更新[课程表]操作,由于[课程表]没有建立级联触发器,成绩表的相关信息没有被更新:

update  课程表  set 课程号='1103' where 课程号='103'


--查询:

select * from 学生表  order  by  学号

select * from 课程表  order  by  课程号

select * from 成绩  order  by  学号, 课程号


练一练:参考上面示例trg_A,请创建课程表与成绩表的级联更新、级联删除触发器。

--创建一个触发器来实现[课程表]与[成绩表]级联更新级联更新、删除

(参考解答)

create  trigger trg_B

on 课程

for update,delete

as

begin

if  exists(select 1 from inserted)

update  成绩  set 课程号=(select 课程号 from inserted) 

  where 课程号=(select 课程号 from deleted)

else

delete  成绩  where 课程号=(select 课程号 from deleted)

end

go

update  课程表  set 课程号='1102' where 课程号='102'


select * from 学生表  order  by  学号

select * from 课程表  order  by  课程号

select * from 成绩  order  by  学号, 课程号


练习:请删除课程表某门课试试,观察情况



(2)创建DDL触发器


语法格式如下:


  CREATE TRIGGER trigger_name 

  ON { ALL SERVER | DATABASE } 

  [ WITH <ddl_trigger_option> [ ,...n ] ]

  { FOR | AFTER } { event_type | event_group } [ ,...n ]

  AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier >  [ ; ] }


参数说明如下:

DATABASE:将DDL触发器的作用域应用于当前数据库。如果指定了此参数,则只要当前数据库中出现event_type或event_group,就会激发该触发器。

ALL SERVER:将 DDL 或登录触发器的作用域应用于当前服务器。如果指定了此参数,则只要当前服务器中的任何位置上出现 event_type 或 event_group,就会激发该触发器。

event_type:执行之后将导致激发DDL触发器的T-SQL语句事件的名称,只不过在名称上与T-SQL 语句略有不同,比如CREATE TABLE语句对应的事件名称为CREATE_TABLE,在关键词之间加上了下划线,常见的选项有CREATE_TABLE、ALTER_TABLE、DROP_TABLE、CREATE_VIEW等。

event_group:预定义的T-SQL语言事件分组的名称。执行任何属于event_group 的Transact-SQL语言事件之后,都将激发DDL触发器。DDL事件组中列出了DDL触发器的有效事件组。CREATE TRIGGER运行完毕之后,event_group 还可通过将其涵盖的事件类型添加到sys.trigger_events目录视图中来作为宏使用。 


【例】创建学生成绩管理系统数据库作用域的DDL触发器。对“学生成绩管理系统”的[教务数据库],当试图删除一个表时,阻止并撤销删除表的操作。

本例代码如下:

USE [教务数据库]

GO

CREATE TRIGGER PreventDropTable

ON DATABASE

AFTER DROP_TABLE

AS

BEGIN

PRINT '不能删除表'

ROLLBACK TRANSACTION

END


【例】创建服务器作用域的DDL触发器。当试图删除一个数据库时,阻止并撤销删除数据库的操作。

对“学生成绩管理系统”的[教务数据库],

本例代码如下:

  USE [教务数据库]

  GO  

  CREATE TRIGGER PreventDropDatabase

    ON ALL SERVER

    AFTER DROP_DATABASE 

    AS

  BEGIN

    PRINT ‘不能删除该数据库’

    ROLLBACK TRANSACTION

  END