实验五 存储过程和触发器的定义和使用3
- 格式:pdf
- 大小:2.48 MB
- 文档页数:17
数据库基础与实践实验报告实验五存储过程和触发器班级:惠普测试142学号:**********姓名:***日期:2016-11-141 实验目的:1)掌握SQL进行存储过程创建和调用的方法;2)掌握SQL进行触发器定义的方法,理解触发器的工作原理;3)掌握触发器禁用和重新启用的方法。
2 实验平台:操作系统:Windows xp。
实验环境:SQL Server 2000以上版本。
3 实验内容与步骤利用实验一创建的sch_id数据库完成下列实验内容。
1.创建存储过程JSXX_PROC,调用该存储过程时可显示各任课教师姓名及其所教课程名称。
存储过程定义代码:CREATE PROCEDURE JSXX_PROCASSELECT tn 教师姓名,cn 所教课程FROM T,TC,C WHERE T.tno=TC.tno AND o=o存储过程执行语句与执行结果截图:EXECUTE JSXX_PROC2.创建存储过程XM_PROC,该存储过程可根据输入参数(学生姓名)查询并显示该学生的学号、所学课程名称和成绩;如果没有该姓名学生,则提示“无该姓名的同学”。
存储过程定义代码:CREATE PROCEDURE XM_PROC @sname VARCHAR(100)ASBEGINIF EXISTS(SELECT NULL FROM S WHERE sn=@sname)SELECT S.sno 学号,cn 课程,score 成绩FROM S,SC,C WHERE o=o AND SC.sno=S.sno ANDS.sn=@snameELSEPRINT'无该姓名的同学。
'END运行截图:3.创建存储过程XBNL_PROC,该存储过程可根据输入参数(专业名词,默认值为计算机专业),统计并显示该专业各年龄段男、女生人数。
如果没有该专业,则显示“无此专业”。
存储过程定义代码:CREATE PROCEDURE XBNL_PROC@departName VARCHAR(30)='计算机',@begin INT,@end INTASDECLARE @numOfBoys INTDECLARE @numOfGirls INTDECLARE @d# VARCHAR(3)DECLARE @result VARCHAR(50)BEGINSELECT @d# = dno FROM D WHERE dn=@departNameIF @d# IS NOT NULLBEGINSELECT @numOfBoys =COUNT(sno)FROM S WHERE age BETWEEN @begin AND @end AND dno=@d# AND sex='男'SELECT@numOfGirls =COUNT(sno)FROM S WHERE age BETWEEN@begin AND@end AND dno=@d# AND sex='女'SET @result = @departName+'专业年龄在'+CAST(@begin AS VARCHAR(3))+'-'+CAST(@end AS VARCHAR(3))+'之间的男生有'+CAST(@numOfBoys AS VARCHAR(3))+'人,'+'女生有'+CAST(@numOfGirls AS VARCHAR(3))+'人'ENDELSESET @result='无此专业。
MySQL中的存储过程和触发器在MySQL数据库中,存储过程和触发器是两种非常有用的特性。
它们可以帮助开发人员简化数据库管理和提高应用程序的效率。
本文将深入探讨MySQL中存储过程和触发器的概念、用途以及如何创建和使用。
一、存储过程存储过程是一组预编译SQL语句的集合,可以使用输入参数,输出参数和返回值。
它们可以用于执行常见的数据库操作,如插入、更新和删除数据。
存储过程还可以用于实现业务逻辑,从而减少在应用程序中执行的SQL语句数量。
1.1 存储过程的优点- 提高性能:存储过程经过编译,可以使用缓存以提高查询性能。
- 简化管理:存储过程可以简化复杂的数据库管理操作,如维护数据库结构和数据安全。
- 实现业务逻辑:存储过程可以在数据库中实现业务逻辑,从而减少应用程序代码中执行的SQL语句的数量和复杂性。
1.2 存储过程的创建和使用在MySQL中创建存储过程需要使用CREATE PROCEDURE语句。
以下是一个简单的示例:```CREATE PROCEDURE get_customer(IN customer_id INT)BEGINSELECT * FROM customers WHERE id = customer_id;END;```在执行上述存储过程后,可以使用以下语句查询:```CALL get_customer(1);```1.3 存储过程的注意事项- 存储过程是在数据库服务器上执行的,因此需要一定的安全性考虑。
- 由于存储过程可以在数据库中执行大量计算,因此可能会影响服务器性能。
二、触发器触发器是一种特殊的存储过程,当特定事件发生时自动触发执行。
可以根据需要定义触发器在INSERT、UPDATE或DELETE操作之前或之后执行。
2.1 触发器的优点- 数据完整性:触发器可以防止对数据库中重要数据的误更改或误删除。
- 降低复杂性:使用触发器可以避免在应用程序中编写对数据库的复杂操作。
2.2 触发器的创建和使用在MySQL中创建触发器需要使用CREATE TRIGGER语句。
实验五存储过程和触发器的使用【目的要求】1、了解存储过程的基本概念和类型。
2、了解创建存储过程的T-SQL语句的基本语法。
3、了解查看、执行、修改和删除存储过程的T-SQL命令的用法。
4、了解触发器的基本概念和类型。
5、了解创建触发器的T-SQL语句的基本语法。
6、了解查看、修改和删除存储过程的T-SQL命令的用法。
【实验内容】内容一:存储过程的使用一、数据需求分析存储过程是一种数据库对象,为了实现某个特定任务,将一组预编译的SQL语句以一个存储单元的形式存储在服务器上,供用户调用,自动完成需要预先执行的任务。
存储过程在第一次执行时进行编译,然后将编译好的代码保存在高速缓存中便于以后调用,提高了代码的执行效率。
二、内容要点分析1、SQL SERVER支持五种类型的存储过程:系统存储过程、本地存储过程、临时存储过程、远程存储过程和扩展存储过程。
其中,系统存储过程是由系统提供的存储过程,可以作为命令执行各种操作。
系统存储过程定义在系统数据库master中,其前缀是sp_。
本地存储过程是指在用户数据库中创建的存储过程,这种存储过程完成特定数据库操作任务,不能以sp_为前缀。
2、只能在当前数据库中创建存储过程。
3、创建存储过程时,应指定所有输入参数和向调用过程或批处理返回的输出参数、执行数据库操作的编程语句和返回至调用过程或批处理以表明成功或失败的状态值。
4、创建存储过程的T-SQL语句CREATE PROC[EDURE] 存储过程名称[{ @参数名称数据类型 }] [,…n][WITH{ RECOMPILE|ENCRYPTION }]ASSQL语句序列说明:(1)RECOMPILE表明每次运行该过程时,将其重新编译。
(2)ENCRYPTION表示 SQL SERVER 加密SYSCOMMENTS表中包含CREATE PROCEDURE语句文本的条目。
注:必须将CREATE PROCEDURE语句放在单个批处理中。
实验五存储过程和触发器的定义和使用一、实验目的1、掌握局部变量、全局变量、流程控制语句的使用方法2、了解存储过程的类型和作用,并掌握使用对象资源管理器和Transact-SQL语句创建存储过程的方法及使用方法。
3、理解触发器的特点和作用,并掌握使用Transact-SQL语言创建触发器的方法二、实验内容1. 在学生成绩库中中有如下各表:学生表(Student)create database学生成绩数据库create table Student(学号Char(6)not null,姓名Char(8)not null,性别Bit not null,出生日期smalldatetime,专业Char(10),所在系Char(10),联系电话Char(11)null)课程表(Course)create table Course(课程号Char(3)not null,课程名Char(20)not null,教师Char(10),开课学期Tinyint,学时Tinyint,学分Tinyint not null,)学生选课成绩表(SC)create table SC(学号Char(6)not null,课程号Char(3)not null,成绩Smallint,)对三个表格分别导入,截图如下:2、T-SQL语句中流程控制语句的使用(1)全局变量的使用。
显示到当前日期和时间为止试图登录SQL Server的次数。
select getdate()as'当前的日期和时间',@@connections as'试图登陆的次数'(2)IF语句的使用。
①在Student表中,若存在学号“020205”的学生,则显示该学生的信息,否则插入该学生的记录(020205, 李萍,0, 1983-7-20, 电子商务, 经济系, 88297171)If exists(select*from Student where学号='020205')select*from Student where学号='020205'Elseinsert into Student values('020205','李萍','0','1983-7-20','电子商务','经济系','88297171')②查询杨颖有没有选课,若选了课,则统计其平均成绩,若没有选课,则输出“杨颖没有选课”If exists(select姓名from Student,SC where姓名='杨颖'and Student.学号=SC.学号)select avg(成绩)from SC,Student where Student.姓名='杨颖'and Student.学号=SC.学号Elseprint'杨颖没有选课!'(3)循环语句的使用。
MySQL存储过程与触发器的使用技巧引言:MySQL是一种广泛使用的开源关系型数据库管理系统,它提供了存储过程和触发器功能,可以帮助开发者更好地管理和操作数据库。
本文将介绍MySQL存储过程和触发器的使用技巧,以帮助读者更好地利用这些功能提升数据库的性能和灵活性。
一、存储过程的概念和作用存储过程是一组预编译的SQL语句,可以在数据库中进行存储和重复执行。
它具有以下的几个主要作用:1. 提高数据库性能:存储过程在执行过程中不需要每次都解析SQL语句,可以减少数据库服务器的负载,提升查询性能。
2. 简化应用程序开发:通过存储过程,可以将复杂的数据操作逻辑封装为一个可供应用程序调用的接口,简化了应用程序的开发过程。
3. 提高安全性:通过存储过程,可以将敏感的数据操作逻辑封装在数据库中,减少了对数据库直接操作时的安全隐患。
二、存储过程的语法和使用方法1. 存储过程的创建:CREATE PROCEDURE procedure_name ([IN|OUT|INOUT] parameter_name parameter_type)BEGIN-- 存储过程的具体实现逻辑END;2. 存储过程的调用:CALL procedure_name(parameter_value);3. 存储过程的注释:DELIMITER // -- 修改定界符CREATE PROCEDURE procedure_name ([IN|OUT|INOUT] parameter_name parameter_type)BEGIN-- 存储过程的具体实现逻辑END //DELIMITER ; -- 恢复定界符4. 存储过程的参数:- IN参数:用于传入存储过程的输入值,仅在存储过程内部使用,不影响原始变量的值。
- OUT参数:用于传出存储过程的输出值,返回给调用者使用。
- INOUT参数:兼具IN和OUT的功能,既可以传入数据,也可以传出数据。
实验五存储过程和触发器的定义和使用实验内容:1.在学生成绩数据库中建立表,并相应的导入数据create database学生成绩use学生成绩create table student(学号char(6)not null,姓名char(8)not null,性别bit not null,出生日期smalldatetime,专业名char(10),所在系char(10),联系电话char(11)null)create table course(课程号char(3)not null,课程名char(20)not null,教师char(10),开课学期tinyint,学时tinyint,学分tinyint not null)create table sc(学号char(6)not null,课程号char(3)not null,成绩smallint)2.(1)全局变量(2)if语句①②(3)循环语句①declare@i int,@sum int,@count intset@i=1set@sum=0set@count=0while (@i<100)beginif(@i%3=0)beginset@sum=@sum+@iset@count=@count+1endset@i=@i+1endprint'总和为:'+convert(varchar(10),@sum)print'个数为:'+convert(varchar(10),@count)②declare@i1int,@s1intset@i1=1set@s1=0beg:if(@i1<=5)beginset@s1=@s1+@i1set@i1=@i1+1goto begendprint@s1(4)waitfor 语句①waitfor delay'00:00:05'select*from studentgo②waitfor time'10:20'exec update_all_stats(5)case语句①select学号,性别=case性别when'1'then'男'when'0'then'女'endfrom studentgo②select学号,成绩=casewhen成绩IS NULL then'未考'when成绩<60 then'不及格'when成绩>=60 and成绩<70 then'及格'when成绩>=70 and成绩<90then'良好'when成绩>=90 then'优秀'endfrom sc3.存储过程(1)create proc proc1asselect学号,课程号from scwhere成绩between 60 and 80goexec proc1(2)①create proc proc21(@学号char(10))asdelete成绩from scwhere学号=@学号go②create proc proc22(@学号char(6),@课程号char(3),@成绩smallint)asinsert into scvalues(@学号,@课程号,@成绩)go(3)create proc proc3(@学号char(6),@课程号char(3),@成绩smallint output)asselect@成绩=成绩from scwhere学号=@学号and课程号=@课程号godeclare@成绩smallintexec proc3'020101','101',@成绩output select'成绩'=@成绩(4)create proc proc_t1(@专业名称char(10))asselect专业名,student.学号,姓名,course.课程号,course.课程名,成绩,学分from student,sc,coursewhere专业名=@专业名称and student.学号=sc.学号and sc.课程号=course.课程号goexec proc_t1'信息管理'go(5)alter proc proc_t1(@专业名称char(10))asselect专业名,student.学号,姓名,course.课程号,course.课程名,成绩,学分from student,sc,coursewhere专业名=@专业名称and student.学号=sc.学号and sc.课程号=course.课程号and student.性别=1goexec proc_t1'信息管理'go(6)drop proc proc_t1(7)create proc proc7(@课程名char(10))asbeginselect课程名,sum(case when成绩between 0 and 59 then 1 else 0 end)as'0-60分', sum(case when成绩between 60 and 79 then 1 else 0 end)as'60-79分', sum(case when成绩between 80 and 89 then 1 else 0 end)as'80-89分', sum(case when成绩between 90 and 100 then 1 else 0 end)as'90-100分' from sc,coursewhere课程名=@课程名and sc.课程号=course.课程号group by课程名endgoexec proc7'英语'go4.(1)create trigger tri_sc_insert on scafter insertasbegindeclare@sno char(6)select@sno=inserted.学号from insertedif not exists(select学号from student where学号=@sno) delete scwhere sc.学号=@snoendgo(2)create trigger tri_sc_upd on scafter updateasif UPDATE(成绩)beginprint'修改失败!!'raiserror ('不能修改SC表的成绩',16,10)rollback transactionendgo③create trigger trigger_1on Coursefor updateasif update(课程号)begin update SCset课程号=(select课程号from inserted)from SC,deletedwhere SC.课程号=deleted.课程号end④create trigger trigger_2on Studentfor deleteasbegindelete SCfrom SC,deletedwhere SC.学号=deleted.学号endgo⑤create trigger trigger_3on Studentfor updateasprint'学生表被修改了!'go⑥alter trigger trigger_3on Studentfor updateasdeclare@kch char(6)select@kch=学号from deletedprint'学生表中学号为'+@kch+'的记录被修改了' go⑦drop trigger trigger_3三、思考题1.存储过程的类型有哪些?分别有什么特征?类型:系统存储过程、扩展存储过程、用户定义存储过程特征:(1)系统存储过程:由系统创建、管理和使用;主要存储在master数据库,以sp_ 为前缀;用户只能对其调用,不能修改或删除;通过系统存储过程能够得到系统信息或为数据库系统管理员管理SQL Server提供支持。
MySQL中的触发器与存储过程使用方法MySQL是一种开源的关系型数据库管理系统,广泛应用于各种类型的应用程序中。
在MySQL中,触发器和存储过程是两个非常重要的特性,它们能够帮助我们更好地管理和处理数据。
本文将探讨MySQL中的触发器和存储过程的使用方法,并介绍一些实际应用的案例。
一、触发器的概念与使用方法1. 触发器的概念触发器是一种与表相关联的特殊类型的存储过程,它在表中发生特定事件时被自动执行。
这些特定事件可以是INSERT、UPDATE或DELETE操作。
通过使用触发器,我们可以在数据发生变化时自动执行一些操作,如数据验证、数据更新等。
2. 创建触发器要创建一个触发器,我们需要使用CREATE TRIGGER语句。
其基本语法如下:CREATE TRIGGER trigger_name{BEFORE | AFTER} {INSERT | UPDATE | DELETE}ON table_nameFOR EACH ROWtrigger_body其中,trigger_name是触发器的名称,可以自定义;BEFORE或AFTER用于指定触发器是在操作之前还是之后执行;INSERT、UPDATE或DELETE用于指定触发器要触发的事件;table_name是触发器所属的表名;trigger_body是触发器的具体操作。
3. 触发器的具体应用触发器在数据库管理中有很多实际应用场景。
比如,可以使用触发器来实现数据完整性约束,通过在INSERT、UPDATE或DELETE操作之前进行数据验证,确保数据的准确性。
另外,触发器还可以用来自动更新一些计算字段,或者将一些操作日志写入其他表。
二、存储过程的概念与使用方法1. 存储过程的概念存储过程是一组在数据库服务器上预先编译过的SQL语句,它们按照特定的顺序组合在一起,形成一个可执行的过程。
存储过程类似于程序中的函数,可以接受参数、执行一系列SQL语句,并返回结果。
存储过程和触发器存储过程和触发器是SQL Server的数据库对象。
使用存储过程可以提高应用程序的效率。
触发器可以大大增强应用程序的健壮性、数据库的可恢复性和可管理性。
一、存储过程存储过程是一组T-SQL语句,它们只需编译一次,以后即可多次执行。
存储过程是在SQL Server中定义的子过程,是数据库对象之一。
存储过程可以执行范围很宽的各种操作与业务功能。
比如可以插入、更新或删除表中的数据。
通过传递参数值,存储过程可以判断是选择数据还是执行其他操作。
由于存储过程可以接受输入参数并以输出参数的格式向调用过程或批处理返回多个值;存储过程是包含用于在数据库中执行操作(包括调用其他过程)的编程语句。
此外存储过程可以向调用过程或批处理返回状态值,以指明成功或失败(以及失败的原因)。
故SQL Server 中的存储过程与其他语言中的过程(有时也称:函数)类似。
可以使用 T-SQL EXECUTE 语句来运行存储过程。
存储过程作为 SQL Server 数据库系统中很重要的概念之一,合理的使用存储过程,可以有效地提高程序的性能;并且将商业逻辑封装在数据库系统中的存储过程中,可以大大提高整个软件系统的维护性。
当商业逻辑发生了改变的时候,不再需要修改并编译客户端的应用程序以及重新分发它们到为数众多的用户手中,只需要修改位于服务器端的实现相应商业逻辑的存储过程即可。
使用 SQL Server 创建应用程序时,T-SQL编程语言是应用程序和 SQL Server 数据库之间的主要编程接口。
使用T-SQL程序时,可用两种方法存储和执行程序;一种是将程序存储在本地,然后创建向SQL Server发送命令并处理结果的应用程序;另一种是将程序作为存储过程存储在SQL Server中,然后创建执行过程并处理结果的应用程序。
在SQL Server中使用存储过程而不使用存储在客户端计算机本地的T-SQL程序,原因在于存储过程具有以下的好处:✓存储过程已在服务器注册。
存储过程、触发器和用户自定义函数实验实验内容一练习教材中存储过程、触发器和用户自定义函数的例子。
教材中的BookSales数据库,在群共享中,文件名为BookSales.bak。
实验内容二针对附件1中的教学活动数据库,完成下面的实验内容。
1、存储过程(1)创建一个存储过程,该存储过程统计“高等数学”的成绩分布情况,即按照各分数段统计人数。
(2)创建一个存储过程,该存储过程有一个参数用来接收课程号,该存储过程统计给定课程的平均成绩。
(3)创建一个存储过程,该存储过程将学生选课成绩从百分制改为等级制(即A、B、C、D、E)。
(4)创建一个存储过程,该存储过程有一个参数用来接收学生姓名,该存储过程查询该学生的学号以及选修课程的门数。
(5)创建一个存储过程,该存储过程有两个输入参数用来接收学号和课程号,一个输出参数用于获取相应学号和课程号对应的成绩。
2、触发器(1)为study表创建一个UPDATE触发器,当更新成绩时,要求更新后的成绩不能低于原来的成绩。
(2)为study表创建一个DELETE触发器,要求一次只能从study表中删除一条记录。
(3)为course表创建一个INSERT触发器,要求插入的课程记录中任课教师不能为空。
3、用户自定义函数(1)创建一个返回标量值的用户定义函数 RectangleArea:输入矩形的长和宽就能计算矩形的面积。
create function RectangleArea(@a int,@b int)returns intasbeginreturn@a*@bend(2)创建一个用户自定义函数,功能为产生一张有关学生成绩统计的报表。
该报表显示每一门课程的课程号、课程名、选修人数、本门最高分、最低分和平均分。
调用这个函数,生成相应的报表并给用户浏览。
create function student_table()returns tableasreturn(select student_course.tcid课程号,ame课程名,COUNT(student_course.sno)选修人数,max(student_course.score)最高分,min(student_course.score)最低分,avg(student_course.score)平均分from student_course,coursewhere student_course.tcid=ogroup by student_course.tcid,ame)实验数据库说明教学活动数据库包括student、course和study三个基本表,三个基本表的结构说明和数据如下:(1)学生表(student)学生表的结构列名数据类型长度是否允许为空值字段说明sno char 5 NO 学号sname char 8 NO 姓名age smallint 年龄sex nchar 1 性别说明:sno为主键,age的范围为15~35之间,sex只能为“男”或“女”。
信息工程学院实验报告课程名称:《数据库原理》实验项目名称:存储过程与触发器一、实验目的:(1)了解存储过程的概念(2)掌握创建、执行存储过程的方法(3)了解查看、修改和删除存储过程的方法(4)了解触发器的概念(5)掌握创建触发器的方法(6)掌握查看、修改、删除触发器信息的方法二、实验设备与器件Win7 +Sql server 2008三、实验内容与步骤(一)存储过程运行实验四附录中的SQL语句,准备实验数据。
然后创建下列存储过程,并调试运行存储过程,查看运行结果。
1.在企业管理器中创建一个名为StuInfo的存储过程,完成的功能是在student表中查询系号为D2的学号、姓名、性别、年龄、系号的内容。
CREATE PROCEDURE StuInfoASSELECT SNO AS学号,SNAME AS姓名,SSEX AS性别,SAGE AS年龄,DNO AS系号FROM studentWHERE DNO='D2'结果:stuinfo2.使用T_SQL语句创建存储过程,完成的功能是在表student,course和study中查询以下字段:学号、姓名、性别、课程名称、考试分数。
use mydb--查询是否已存在此存储过程,如果存在,就删除它if exists(select name from sysobjectswhere name='StuScoreInfo'and type='P')drop procedure StuScoreInfogo--创建存储过程CREATE PROCEDURE StuScoreInfoasselect student.sno as学号,sname as姓名,ssex as性别,ame as课程名称,study.grade as考试分数from student,course,studywhere student.sno=study.sno and o=o结果:StuScoreInfo3.使用T_SQL语句创建一个带有参数的存储过程stu_sno_info,该存储过程根据传入的学生编号,在student表中查询此学生的信息。
MySQL中的触发器和存储过程详解MySQL是一种常用的关系型数据库管理系统,它支持多种高级功能,其中包括触发器和存储过程。
在本文中,将详细讨论MySQL中的触发器和存储过程,并解释它们的作用和用法。
一、触发器的概念和作用1.触发器的概念触发器是MySQL中一个非常强大和灵活的特性,它允许在表中的数据发生某些特定的事件时自动执行一些操作。
这些事件可以是插入、更新或删除数据等。
触发器可以用于检查数据的完整性、实现业务规则、触发其他操作等。
2.触发器的作用触发器可以极大地简化数据库的管理和维护工作,并提高系统的安全性和完整性。
通过使用触发器,可以在数据库中实现复杂的业务逻辑,并确保数据的一致性和正确性。
触发器还可以对数据进行约束和验证,以确保数据库中的数据满足特定的条件。
二、触发器的语法和用法1.创建触发器创建触发器使用CREATE TRIGGER语句,语法如下:```sqlCREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW trigger_body```- trigger_name:触发器的名称,可以自由命名,但必须唯一。
- trigger_time:触发器的时间,可以是BEFORE或AFTER。
- trigger_event:触发器的事件,可以是INSERT、UPDATE或DELETE。
- table_name:触发器所属的表名。
- trigger_body:触发器的执行体,可以是一段SQL代码或调用存储过程等。
2.触发器的执行时机和事件触发器可以在数据发生变化之前(BEFORE)或之后(AFTER)执行,并可以针对INSERT、UPDATE或DELETE等事件进行触发。
通过指定不同的触发时机和事件,可以实现不同的功能。
3.触发器的执行体触发器的执行体可以是一段SQL代码,用来实现特定的业务逻辑。
实验五触发器、存储过程操作实验本实验需要2学时。
请大家先根据“触发器.doc”文档完成相关操作,再进行本次实验。
介绍完“存储过程”后,需上交本次实验报告。
一、实验目的(1)掌握SQL Server中的触发器的使用方法;(2)掌握存储过程的操作方法。
二、实验内容1. 创建、查看、修改和删除触发器。
2. 创建、查看、修改和删除存储过程。
三、实验方法1. 触发器的操作(1)建立触发器方法一:使用企业管理器首先,打开企业管理器,定位数据库并找到要创建触发器的表;然后,右击该表名,在弹出的快捷菜单中选择“设计表”,在打开的“设计表”窗口中单击按钮,打开如图1所示窗口。
图1 触发器属性窗口最后,在触发器属性窗口中输入触发器的内容,并单击“确定”按钮。
方法二:使用CREATE TRIGGER语句语法:CREATE TRIGGER <触发器名>ON { <表名> | <视图名>}{ FOR | INSTEAD OF | AFTER}{ [UPDATE] [,] [INSERT] [,] [DELETE]}AS<SQL 语句块>(2)查看触发器方法一:使用企业管理器方法二:使用T-SQL语句- sp_help <触发器名>- sp_helptext <触发器名>- sp_depends <触发器名>(3)修改触发器方法一:使用企业管理器方法二:使用ALTER TRIGGER语句语法:ALTER TRIGGER <触发器名>ON { <表名> | <视图名>}{ FOR | INSTEAD OF | AFTER}{ [UPDATE] [,] [INSERT] [,] [DELETE]} AS<SQL 语句块>(4)删除触发器方法一:使用企业管理器方法二:使用DROP TRIGGER语句语法为:DROP TRIGGER <触发器名>2. 存储过程的操作(1)建立存储过程方法一:使用建立存储过程向导方法二:使用企业管理器方法三:使用SQL语句(CREATE PROCEDURE)语法:CREATE PROC[EDURE] <存储过程名>[{@<参数名> <数据类型>}]AS {<SQL语句> | <语句块> }(2)查看存储过程方法一:使用企业管理器方法二:使用SQL语句(系统存储过程)- sp_help <存储过程名>- sp_helptext <存储过程名>- sp_depends <存储过程名>(3)修改存储过程方法一:使用企业管理器方法二:使用SQL语句(ALTER PROCEDURE)语法为:ALTER PROC[EDURE] <存储过程名>[{@<参数名> <数据类型>}]AS {<SQL语句>| <语句块> }(4)删除存储过程方法一:使用企业管理器方法二:使用DROP PROCEDURE语句语法为:DROP PROCEDURE <存储过程名>四、实验内容1、在学生表student上建立一个DELETE类型的触发器tr_delete,触发动作是显示信息“已删除学生表中的数据”。
实验5触发器的定义一实验题目:触发器的定义。
二实验目的:熟悉触发器的定义和使用。
三实验内容及要求:(从下面10个题目中选一个)题目一:学生(学号,年龄,性别,系名)课程(课号,课名,学分,学时)选课(学号,课号,成绩)1.建立学生表的insert触发器,若向学生表中插入一条记录,则自动向选课表中插入一行,令该生选一门选修人数最多的课。
2.在建立学生表的delete触发器,若选课表中该生有选课记录,则拒绝删除,要求在删除学生信息同时,将相关表中的信息全部删除。
题目二:图书(书号,书名,价格,出版社)读者(卡号,姓名,年龄,所属单位)借阅(书号,卡号,借阅日期)建立图书的insert触发器,若向图书中插入一条记录,则自动向借阅表中插入一行,令该书被借阅次数最多的读者借阅。
题目三:商品(编号,品名,进价,库存,售价,厂商编号)顾客(卡号,姓名,电话,积分)厂商(编号,厂址,名称、电话)销售(顾客卡号,商品编号,数量,日期)建立商品的delete 触发器,只有当此商品没有人买时才可删除,若有销售记录不能删除。
题目四:图书(书号,书名,作者编号,价格,出版社编号)作者(编号,姓名,电话)出版社(编号,出版社名称,地址)建立作者的delete 触发器,只有当此作者没有任何作品才可删除,若有出书的记录不能删除。
题目五:零件(编号,名称,颜色)车间(编号,名称,人数,主任)产品(编号,名称,车间编号)使用(产品编号,使用零件编号,个数)建立零件的delete 触发器,只有当此零件没有产品用时才可删除,若有使用记录不能删除。
题目六:药品(编号,名称,价格,厂商)处方(药品编号,数量,医生编号)医生(编号,姓名,科室,职称)建立药品的delete 触发器,只有当此药品品没有人买时才可删除,若有处方记录不能删除。
题目七:学生(学号,年龄,性别,系名)教材(编号,书名,出版社编号,价格)订购(学号,书号,数量)出版社(编号,名称,地址)建立学生的insert触发器,若向学生表中插入一条记录,则自动向订购表中插入一行,令该学生订购被订购数量最多的教材。
实验五存储过程和触发器一、实验目的(1) 通过实践理解存储过程和触发器的概念、作用及优点;(2) 掌握存储过程的定义与调用,实现存储过程中带有不同参数的应用;(3) 掌握创建触发器。
二、实验原理1.存储过程一个被命名的存储在服务器上的T-SQL语句的集合,是封装重复性工作的一种方法。
(1)创建存储过程CREATE PROC[DURE]PROCDURE_NAME [{@PARAMENT DATA_TYPE}[VARYING][=DEFAULT][OUTPUT]] [, (1)AS SQL_STATEMENTPROCEDURE_NAME:新存储过程的名称,必须符合标识符规则且唯一。
@PARAMETER:过程中的参数。
可以声明一个或多个参数。
用户必须在执行过程时提供每个所声明参数的值(除非定义了该参数的默认值)。
使用 @ 符号作为第一个字符来指定参数名称。
参数名称须符合标识符规则。
每个过程的参数仅用于该过程本身;相同的参数名称可用在其它过程中。
默认情况下参数只能代替常量,不能代替表名、列名或其它数据库对象名称。
DATA_TYPE:参数的数据类型。
DEFAULT:参数的默认值。
如果定义了默认值,不必指定该参数的值即可执行过程。
默认值必须是常量或 NULL。
OUTPUT:表明参数是返回参数。
该选项的值可以返回给 EXEC[UTE]。
使用 OUTPUT 参数可将信息返回给调用过程。
(2)执行存储过程SQL SERVER系统中,可以使用EXECUTE语句执行存储过程。
EXECUTE语句也可以简写为EXEC。
如果将要执行的存储过程需要参数,那么应该在存储过程名称后面带上参数值。
[EXEC[UTE]]{[@RETURN_STATUS=]{PROCEDURE_NAME[;NUMBER]|@PROCEDURE_NAME_VAR}[@PARAMETER={VALUE|@VARIABLE[OUTPUT]|[DEFAULT]}[,…N](3) 删除存储过程使用DROP PROCEDURE语句可永久地删除存储过程。
实验名称:存储过程与触发器实验目的:掌握SQLSERVER存储过程与触发器的定义、调用操作数据库结构关系:语法规定:(1)存储过程定义语法:CREATE PROC 过程名@parameter 参数类型……@parameter 参数类型outputASBegin命令块End利用TSQL调用存储过程:Execute 过程名[参数值,……][Output]如果没有参数,直接调用过程名(2)创建事后触发器的语法:CREATE TRIGGER 触发器名ON 表名For Insert [,Update,Delete] AsBegin命令块End(3)创建替代触发器的语法:CREATE TRIGGER 触发器名ON 表名Instead of Insert [,Update,Delete] AsBegin命令块End实验内容:(一)存储过程(1)创建带输入参数的存储过程,输入查询的工资范围,输出查询到的职工信息Create proc Myproc1@mingzint,@maxgzintasselect * from 职工表where 工资between @mingz and @maxgz 调用该过程execute Myproc1 1000,4000(2)使用Transact-SQL语言创建带输入输出参数的存储过程。
输入仓库号,输出该仓库的职工信息、职工最高工资、最低工资Create proc Myproc2@cangkuhaovarchar(50),@maxgzint output,@avggzint outputasbeginselect * from 职工表where 仓库号=@cangkuhaoSelect @maxgz=max(工资) from 职工表where 仓库号=@cangkuhaoSelect @avggz=avg(工资) from 职工表where 仓库号=@cangkuhaoEnd调用存储过程。
实验五存储过程和触发器的定义和使用一、实验目的1、掌握局部变量、全局变量、流程控制语句的使用方法2、了解存储过程的类型和作用,并掌握使用对象资源管理器和Transact-SQL语句创建存储过程的方法及使用方法。
3、理解触发器的特点和作用,并掌握使用Transact-SQL语言创建触发器的方法二、实验内容1.在学生成绩库中中有如下各表:学生表(Student)学号姓名性别出生日期专业所在系联系电话020101杨颖01980-7-20计算机应用计算机88297147 020102方露露01981-1-15信息管理计算机88297147 020103俞奇军11980-2-20信息管理计算机88297151 020104胡国强11980-11-7信息管理计算机88297151 020105薛冰11980-7-29水利工程水利系88297152 020201秦盈飞01981-3-10电子商务经济系88297161 020202董含静01980-9-25电子商务经济系88297062 020203陈伟11980-8-7电子商务经济系88297171 020204陈新江11980-7-20房建水利系88297171 create database学生成绩数据库create table Student(学号Char(6)not null,姓名Char(8)not null,性别Bit not null,出生日期smalldatetime,专业Char(10),所在系Char(10),联系电话Char(11)null)课程表(Course)课程号课程名教师开课学期学时学分101计算机原理陈红2453102计算方法王颐3453103操作系统徐格2604104数据库原理及应用应对刚3755105网络基础吴江江4453106高等数学孙中文1906107英语陈刚1906108VB程序设计赵红韦3705create table Course(课程号Char(3)not null,课程名Char(20)not null,教师Char(10),开课学期Tinyint,学时Tinyint,学分Tinyint not null,)学生选课成绩表(SC)学号课程号成绩020********020********020********020********020********020********020********020********020********020********create table SC(学号Char(6)not null,课程号Char(3)not null,成绩Smallint,)对三个表格分别导入,截图如下:2、T-SQL语句中流程控制语句的使用(1)全局变量的使用。
显示到当前日期和时间为止试图登录SQL Server的次数。
select getdate()as'当前的日期和时间',@@connections as'试图登陆的次数'(2)IF语句的使用。
①在Student表中,若存在学号“020205”的学生,则显示该学生的信息,否则插入该学生的记录(020205,李萍,0,1983-7-20,电子商务,经济系,88297171)If exists(select*from Student where学号='020205')select*from Student where学号='020205'Elseinsert into Student values('020205','李萍','0','1983-7-20','电子商务','经济系','88297171')②查询杨颖有没有选课,若选了课,则统计其平均成绩,若没有选课,则输出“杨颖没有选课”If exists(select姓名from Student,SC where姓名='杨颖'and Student.学号=SC.学号)select avg(成绩)from SC,Student where Student.姓名='杨颖'and Student.学号=SC.学号Elseprint'杨颖没有选课!'(3)循环语句的使用。
①用WHILE语句编程计算1-100之间所有能被3整除的数的个数及总和。
DECLARE@S SMALLINT,@I SMALLINT,@NUMS SMALLINTSET@S=0SET@I=1SET@NUMS=0WHILE(@I<=100)BEGINIF(@I%3=0)BEGINSET@S=@S+@ISET@NUMS=@NUMS+1ENDSET@I=@I+1ENDPRINT@SPRINT@NUMS②利用GOTO语句求出从1加到5的总和。
DECLARE@S SMALLINT,@I SMALLINTSET@I=1SET@S=0BEG:IF(@I<=5)BEGINSET@S=@S+@ISET@I=@I+1GOTO BEGENDPRINT@S(4)WAITFOR语句的使用。
①等待5秒后执行查询Student学生信息waitfor delay'00:00:05'select*from Student②等到晚上10:20执行存储过程update_all_stats。
BEGINWAITFOR TIME'10:20'EXECUTE update_all_statsEND(5)CASE语句的使用。
①查询Student的SNO,SEX,如果SEX为“1”则输出“男”,如果为“0”输出“女”。
SELECT学号,性别=CASE性别WHEN'1'THEN'男'WHEN'0'THEN'女'ENDFROM Student②从SC表中查询所有同学选课成绩情况,凡成绩为空者输出“未考”、小于60分输出“不及格”、60分至70分输出“及格”、70分至90分输出“良好”、大于或等于90分时输出“优秀”。
SELECT学号,课程号,成绩=CASEWHEN成绩IS NULL THEN'未考'WHEN成绩<60THEN'不及格'WHEN成绩>=60AND成绩<70THEN'及格'WHEN成绩>=70AND成绩<90THEN'良好'WHEN成绩>=90THEN'优秀'ENDFROM SC3、存储过程的的使用。
在上面学生成绩库中完成如下操作:(1)创建如下不带参数的简单存储过程:查询成绩在60至80分之间的学生的学号和课程号。
create procedure SCListasselect学号,课程号from SCwhere成绩>60and成绩<80(2)分别创建如下的带输入参数的存储过程:①根据用户输入的学号,删除该学生选课成绩记录;create procedure studentqk1(@学号char(10))asdelete成绩from SCwhere学号=@学号②向SC表中插入数据。
create procedure sccharu(@学号char(10),@课程号char(10),@成绩int)asinsert into SC values(@学号,@课程号,@成绩)(3)创建如下的带输出参数的存储过程,并写出一个执行该过程的例子:根据用户输入的学号,课程号,输出其成绩。
create procedure grade(@学号char(10),@课程号char(10)output,@成绩int output)asselect@成绩=成绩from SCwhere学号=@学号and课程号=@课程号declare@成绩intexecute grade'020101','101',@成绩outputselect'成绩'=@成绩(4)创建存储过程proc_t1,要求实现如下功能:输入专业名称,产生该专业学生的选课情况列表,其中包括专业、学号、姓名、课程号、课程名、成绩、学分等。
并调用此存储过程,显示“信息管理”专业学生的选课情况列表。
create procedure proc_t1(@专业char(10))asselect Student.学号,Student.专业,Student.姓名,Course.课程号,Course.课程名,Course.学分,成绩from Student,Course,SCwhere Student.学号=SC.学号and Course.课程号=SC.课程号and Student.专业=@专业exec proc_t1'信息管理'(5)对学生成绩库中已创建的存储过程proc_t1进行修改,要求实现如下功能:输入专业名称,产生该专业所有男生的选课情况列表,其中包括专业、学号、姓名、课程号、课程名、成绩、学分等。
并调用修改后的存储过程,显示“信息管理”专业男生的选课情况列表。
alter procedure proc_t1(@专业char(10))asselect Student.学号,Student.专业,Student.姓名,Course.课程号,Course.课程名,Course.学分,成绩from Student,Course,SCwhere Student.学号=SC.学号and Course.课程号=SC.课程号and Student.专业=@专业and性别=1exec proc_t1'信息管理'(6)删除学生成绩库中的存储过程proc_t2。
drop procedure proc_t1(7)编写存储过程,要求实现如下功能:输入课程名称,产生该课程各分数段及其相应人数的成绩分布情况统计。
create procedure scqk(@课程名char(10))asbeginselect课程名,sum(case when成绩between0and59then1else0end)as'不及格',sum(case when成绩between60and69then1else0end)as'60-69',sum(case when成绩between70and89then1else0end)as'70-89',sum(case when成绩between90and100then1else0end)as'90-100' from SC,Coursewhere SC.课程号=Course.课程号and课程名=@课程名group by课程名endexec scqk'计算机原理'4、触发器的使用。