触发器的定义和使用

实验题目:触发器的定义。

实验目的:熟悉触发器的定义和使用。

实验内容及要求:

从下面10个题目中选一个)

题目一:

学生(学号,年龄,性别,系名)

课程(课号,课名,学分,学时)

选课(学号,课号,成绩)

1.建立学生表的insert触发器,若向学生表中插入一条记录,则自动向选课表中插入一行,令该生选一门选修人数最多的课。

2.在建立学生表的delete触发器,若选课表中该生有选课记录,则拒绝删除,要求在删除学生信息同时,将相关表中的信息全部删除。

CREATE TRIGGER tgr_ins
ON Student
FOR insert
AS
DECLARE @Snum CHAR(4),@Cnum CHAR(4);
BEGIN
SELECT @Snum=Snum FROM inserted;
SELECT TOP 1 @Cnum=Cnum FROM (SELECT
Cnum,COUNT(Cnum) C FROM CC GROUP BY Cnum) t
order by t.c desc
INSERT INTO CC(Snum,Cnum) VALUES(@Snum, @Cnum);
END

题目二:

图书(书号,书名,价格,出版社)

读者(卡号,姓名,年龄,所属单位)

借阅(书号,卡号,借阅日期)

建立图书的insert触发器,若向图书中插入一条记录,则自动向借阅表中插入一行,令该书被借阅次数最多的读者借阅。

create view view_ trigger(Rcardno,借阅次数)
as
 select Rcardno,COUNT (*)
 from Borrow
 group by Rcardno

create trigger ins_ trigger
on Books
for insert
as
 declare @Bno nchar(10)
 declare @Rcardno int
 select @Bno = Bno from inserted
 select @Rcardno = Rcardno from view_ trigger
 where借阅次数=(select max(借阅次数)
    from view_ trigger)
insert into Borrow values (@Bno,@Rcardno,'2013,12,25')

题目三:

商品(编号,品名,进价,库存,售价,厂商编号)

顾客(卡号,姓名,电话,积分)

厂商(编号,厂址,名称、电话)

销售(顾客卡号,商品编号,数量,日期)

建立商品的delete 触发器,只有当此商品没有人买时才可删除,若有销售记录不能删除。

题目四:

图书(书号,书名,作者编号,价格,出版社编号)

作者(编号,姓名,电话)

出版社(编号,出版社名称,地址)

建立作者的delete 触发器,只有当此作者没有任何作品才可删除,若有出书的记录不能删除。

题目五:

零件(编号,名称,颜色)

车间(编号,名称,人数,主任)

产品(编号,名称,车间编号)

使用(产品编号,使用零件编号,个数)

建立零件的delete 触发器,只有当此零件没有产品用时才可删除,若有使用记录不能删除。

题目六:

药品(编号,名称,价格,厂商)

处方(药品编号,数量,医生编号)

医生 (编号,姓名,科室,职称)

建立药品的delete 触发器,只有当此药品没有人买时才可删除,若有处方记录不能删除。

题目七:

学生(学号,年龄,性别,系名)

教材(编号,书名,出版社编号,价格)

订购(学号,书号,数量)

出版社(编号,名称,地址)

建立学生的insert触发器,若向学生表中插入一条记录,则自动向订购表中插入一行,令该学生订购被订购数量最多的教材。

题目八:

员工(编号,姓名,性别,年龄,部门编号,年薪)

部门(编号,名称,人数,负责人)

项目(编号,名称,负责部门编号)

建立部门的delete触发器,当删除一条部门记录,1)如果这个部门有负责的项目则将它所负责的项目转到除该部门以外负责项目最少的部门名下。2)将这个部门的员工转到2号部门下。(假设删除的不是2号部门)

create trigger 部门_delete
on 部门
for delete
as
declare @bm varchar(20)
declare @bm1 varchar(20)
declare @num int
select @bm=部门编号 from deleted
select @num=count(项目负责部门) from 项目 where 项目负责部门=@bm
if(@num<>0)
 select top 1 @bm1=项目负责部门 from 项目 where 项目负责部门<>@bm group by 项目负责部门
order by count(*)
 update 项目 set 项目负责部门=@bm1 where 项目负责部门=@bm
 update 员工 set 部门编号=2 where 部门编号=@bm
 if(@num=0)
 update 员工 set 部门编号=2 where 部门编号=@bm
 print'success'

题目九:

帐户(编号,姓名,余额,建立日期,储蓄所编号)

储蓄所(编号,名称,地址,人数,所属城市)

借贷(帐户,借贷类型,金额,日期)

建立储蓄所的delete 触发器,只有当此储蓄所没有帐户时才可删除,若有销售记录不能删除。

题目十:

仓库(编号,保管员编号,面积)

保管员(编号,姓名,年龄,电话、月薪)

商品(编号,品名,仓库编号、数量,单价)

建立仓库的delete 触发器,只有当此仓库没有商品时才可删除。

Create Trigger ck_1 ON CANGKU
After Delete
AS
Begin
    IF Exists(Select 2 From Deleted D Join SHANGPING S ON S.cangkubianhao = D.bianhao And S.shuliang <> 0)
    Begin
        Raiserror('仓库有商品,不能执行删除操作',15,1)
        rollback
    End
End

四 实验指导

1 定义触发器

CREATE TRIGGER trigger_name
ON table
[WITH ENCRYPTION]
{
    {FOR { [DELETE] [,] [INSERT] [,] [UPDATE] }
        [WITH APPEND]
        [NOT FOR REPLICATION]
        AS
            sql_statement [...n]
    }
    |
    {FOR { [INSERT] [,] [UPDATE] }
        [WITH APPEND]
        [NOT FOR REPLICATION]
        AS
        {    IF UPDATE (column)
            [{AND | OR} UPDATE (column)]
                [...n]
            | IF (COLUMNS_UPDATED() {bitwise_operator} updated_bitmask)
                { comparison_operator} column_bitmask [...n]
        }
            sql_statement [ ...n]
    }
}

CREATE  TRIGGER INS-TRIGGER

ON  SALES

FOR  INSERT

AS

UPDATE TITLES

     SET ytd_sales=ytd_sales+( select  sum(qty) 

from  inserted 

group by inserted.title_id

having titles.title_id=inserted.title_id)

 2

CREATE TRIGGER UPD_TRIGGER

ON SALES

FOR  UPDATE

AS

UPDATE TITLES

     SET    ytd_sales=ytd_sales - ( select  sum(qty) 

from  deleted 

group by deleted.title_id

having titles.title_id=deleted.title_id)

  3

CREATE TRIGGER UPD_TRIGGER

ON SALES

FOR  DELETE

AS

IF (select count(*) from TITLE,  deleted  where titles.title_id =deleted.title_id)<>0

UPDATE TITLES

     SET    ytd_sales=ytd_sales - ( select  sum(qty) 

from  deleted 

group by deleted.title_id

having titles.title_id=deleted.title_id)

4

USE pubs

IF EXISTS (SELECT name FROM sysobjects

        WHERE name = 'reminder' AND type = 'TR')

    DROP TRIGGER reminder

GO

CREATE TRIGGER employee_insupd

ON employee

FOR INSERT, UPDATE

AS

/* Get the range of level for this job type from the jobs table. */

DECLARE @min_lvl tinyint,

    @max_lvl tinyint,

    @emp_lvl tinyint,

    @job_id smallint

SELECT @min_lvl = min_lvl,

    @max_lvl = max_lvl,

    @emp_lvl = i.job_lvl,

    @job_id = i.job_id

FROM employee e INNER JOIN inserted i ON e.emp_id = i.emp_id

    JOIN jobs j ON j.job_id = i.job_id

IF (@job_id = 1) and (@emp_lvl <> 10)

BEGIN

    RAISERROR ('Job id 1 expects the default level of 10.', 16, 1)

    ROLLBACK TRANSACTION

END

ELSE

IF NOT (@emp_lvl BETWEEN @min_lvl AND @max_lvl)

BEGIN

    RAISERROR ('The level for job_id:%d should be between %d and %d.',

        16, 1, @job_id, @min_lvl, @max_lvl)

    ROLLBACK TRANSACTION

END

实验报告要求:

1 按要求写出触发器定义。

2 给出验证数据和操作结果

3 遇到的问题和解决方法

本文整理自数据库习题课1列出student表中所有记录的name,sex和class列; select name,sex,class from student;2显示教师所在的单位即不重复的depart列; select distinct depart fromhttps://www.renrendoc.com/paper/156703532.html

数据库习题课 - 道客巴巴https://www.doc88.com/p-9445443528238.html

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
建立环境实验和数据库/表 实验学时:2学时 实验类型:验证 实验要求:必修 一、实验目的 通过本实验的学习,使学生熟悉SQL Server 2014的集成环境,帮助学生掌握数据库、表的建立方法以及SQL Server的据导入方法 二、实验内容    (一)、SQL Server 2014的安装 SQL Server2014的安装过程与 SQL Server 2008、SQL Server2012的安装过程类似,都提供了一个功能树以用来安装所有 SQL Server 组件,包括计划、安装、维护、工具、资源、高级、选项等功能。下面是各功能选项中所包含的内容,如图3-1所示。 图3-1 安装计划中的内容 (1)选择“安装”功能,因为要创建SQL Server 2014的全新安装,单击“全新SQL Server 2014独立安装或向现有安装添加功能”选项,如图3-2所示。 图3-2 “安装”功能中的内容 (2)在“产品密匙”页上,选择相应的单选按钮,这些按钮指示是安装免费版本的SQL Server还是具有产品密匙的产品版本,如果使指免费的评估版,只有180天的试用期限,如图3-3所示。 图3-3 “产品密钥”界面 (3)在“许可条款”页上阅读许可协议,然后选中相应的复选框以接受许可条款和条件。如图3-4所示。 图3-4 “许可条款”界面 (4)系统进行安装程序支持规则检查,以确定安装SQL Server安装程序支持文件时可能发生的问题。必须更正所有的失败,安装程序才能继续。如图3-5所示。 图3-5 “安装规则”界面 (5)在“设置角色”页上选择SQL Server功能安装,如图3-6所示。 图3-6 “设置”角色界面 (6)在“功能选择”页上选择要安装的组件。选择功能名称后,右侧窗体中会显示每个组件的说明。可以根据实际需要,选中一些功能,如图3-7所示。一般应用可选择“数据库引擎服务”、“客户端工具连接”、“SQL客户端连接”和“管理工具”等选项。 图3-7“功能选择”界面 (7)在“实例配置”页上制定是安装默认实例还是命名实例,对于默认实例,实例的名称和ID都是MSSQLSERVER,也可以自己“命名实例”安装实例,如图3-8所示。SQL Server支持多个实例,即支持在同一台计算机上同时运行多个SQL Server数据库引擎实例,每个SQL Server数据库引擎实例各有一套不为其它实例共享的系统及用户数据库。应用程序连接同一台计算机上的SQL Server数据库引擎实例的方式与连接其它计算机上运行的SQL Server数据库引擎的方式基本相同。 图3-8 “实例配置”界面 (8)在“服务器配置”页上指定SQL Server服务的登录帐户。SQL Server提供了多种服务,可以为所有SQL Server服务分配相同的登录账户,也可以分别配置每个服务账户。还可以指定服务是自动启动、手动启动还是禁用。Microsoft建议对各服务账户进行单独配置,以便为每项服务提供最低特权,即向SQL Server服务授予它们完成各自任务所需的最低权限,如图3-9所示。SQL Server中的每个服务代表一个进程或一组进程,每个进程需要有访问SQL Server相关文件和系统注册表的权限,为了能让SQL Server服务在操作系统中正常的启动和运行,就需要指定SQL Server的服务帐户,所以服务帐户指的是Windows操作系统中的帐户。 图3-9 “服务器配置”界面 (9)在“数据库引擎配置”的“服务器配置”页上指定身份验证模式、用户名、密码,如图3-10所示。这里的用户身份验证指的是登录到服务器使用的身份验证模式及用户名和密码。身份验证模式分为“Windows身份验证模式”和“混合模式(SQL Server身份验证和Windows身份验证)”。如果选择“Windows身份验证模式”表示则只能使用Windows的帐号登录,即使用当前登录到操作系统的帐号进行登录,通过这种方式用户登录到SQL Server中时不再需要输入帐号和密码。如选择“混合模式(SQL Server身份验证和Windows身份验证)”表示除了可以用使用登录到Windows的帐号作为登录的依据外,还可以使用SQL Server系统的帐号登录,这里必须为内置SQL Server系统管理员账户(SA)提供一个强密码。必须至少为SQL Server实例指定一个系统管理员。若要添加用以运行SQL Server安装程序账户,则要单击“添加当前用户”按钮。若要向系统管理员列表中添加账户或从中删除账户,则单击“添加…”或“删除…”按钮,然后编辑将拥有SQL Server实例的管理员特权的用户、组或计算机列表。 图3-10 设置身份验证模式和管理员 (10)在“准备安装”页显示安装过程中的安装选项的树视图,如图3-11所示。若要继续,单击“安装”按钮。在安装过程中,“安装进度”页会提供相应的状态,因此可以在安装过程中监视安装进度。 图3-121“准备安装”界面 (11)安装完成后,“完成”页提供指向安装日志文件摘要以及其他重要说明的链接。如图3-12所示。 图3-12 “安装完成”界面 (二)、建库建表练习      1、利用语句建库和建表: 创建学生数据库StuDB,文件名和位置自定,在此数据库中创建如下三张表: 学生表(student) (   学号(sno) 普通编码定长字符类型,长度9,主码,   姓名(sname) 普通编码定长字符类型,长度10,非空,   性别(ssex) 统一编码定长字符类型,长度2,   年龄(sage) 微整型,   所在系(sdept) 统一编码可变长字符类型,长度20 ) 课程表(course) (   课程号(cno) ,通编码定长字符类型,长度4,主码,   课程名(cname) 统一编码定长字符类型,长度,40,非空,   开课学期(Semester) 短整, 学分(credit) 短整 ) 修课表(sc)(   学号(sno) 普通编码定长字符类型,长度7,主码,外码   课程号(cno) 普通编码定长字符类型,长度6,主码,外码   成绩(grade) 小整型,   修课类别(ctype)普通编码定长字符类型,长度4 ) 2、建立“汽车”数据库,文件名和位置自定,在此数据库中创建如下三张表: 汽车表(CarT),结构如下:   汽车序号(CId) 整型 主关键字,   汽车名称(CName) 普通编码定长字符类型 长度为10  非空,   型号(CType)普通编码变长字符类型 长度为60  非空,   价格(CPrice) 整型,   车身眼色(Ccolor)普通编码变长字符类型 长度为20。 部门表(DepartT),结构如下:   部门序号(DId)整型 主关键字,   部门名(DName)普通编码定长字符类型 长度为20   非空,   负责人名(DLead)普通编码定长字符类型 长度为10  非空,   人(DAmount) 整型。 汽车出厂表(FacT),结构如下:   汽车序号(CID) 整型 非空,   部门序号(DId) 整型 非空,   出厂日期(FDate)小日期时间型 非空,   出厂量(FAmount) 整型,   出厂价格(FPrice) 整型。   其中:主关键字为(汽车序号,部门序号,出厂日期)   “汽车序号”为引用汽车表的“汽车序号”的外部关键字; “部门序号”为引用部门表的“部门序号”的外部关键字。 3、使用数据库的可视化工具建库建表 建立银行贷款表,具体要求同课堂教学的建库建表一致。 银行表(BankT)( 银行代码(Bno) 主键 银行名称(Bname) 非空 电话(Tel) ) 法人表(LET)( 法人代码(Eno)主键 法人名称(Ename)取值唯一 经济性质(Enature) 注册资金(Ecapital) 法定代表人(Erep) ) 贷款表(LoanT)( 法人代码(Eno) 银行代码(Bno) 贷款日期(Ldata) 贷款金额(Lamount) 贷款期限(Lterm) )        (三)、据导入练习 将“学生数据库据.xls”中的据导入到学生数据库的三张表中。 将“银行贷款据.xls”中的据导入到银行贷款数据库的三张表中。 三、实验报告 将实验结果反映在实验报告中,并对实验中遇到的问题及解决方案、进行整理、分析总结,提出实验结论或自己的看法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值