数据库实验触发器题目
《数据库原理与应用》实验存储过程和触发器(部分答案)
实验6存储过程和触发器1.实验目的(1)掌握通过SQL Server管理平台和Transact-SQL语句CREATE PROCEDURE创建存储过程的方法和步骤。
(2)掌握使用Transact-SQL语句EXECUTE执行存储过程的方法。
(3)掌握通过SQL Server管理平台和Transact-SQL语句ALTER PROCEDURE修改存储过程的方法。
(4)掌握通过SQL Server管理平台和Transact-SQL语句DROP PROCEDURE删除存储过程的方法。
(5)掌握通过SQL Server管理平台和Transact-SQL语句CREATE TRIGGER创建触发器的方法和步骤。
(6)掌握引发触发器的方法。
(7)掌握使用SQL Server管理平台或Transact-SQL语句修改和删除触发器。
(8)掌握事务、命名事务的创建方法,了解不同类型的事务的处理情况。
2.实验内容及步骤请先附加studentsdb数据库,然后完成以下实验。
(1)在查询设计器中输入以下代码,创建一个利用流控制语句的存储过程letters_print,该存储过程能够显示个小写字母。
语句:CREATE PROCEDURE letters_printASDECLARE@count intSET@count=0WHILE@count<26BEGINPRINT CHAR(ASCII('a')+@count)SET@count=@count+1ENDexec letters_print(2)输入以下代码,创建存储过程stu_info,执行时通过输入姓名,可以查询该姓名对应的学生的各科成绩。
语句:create proc stu_info@name char(10)asbeginSELECT姓名,g.课程编号,分数FROM dbo.student_info s JOIN grade gON s.学号=g.学号WHERE s.姓名=@nameEndexec stu_info'马东'(3)使用系统存储过程sp_rename将存储过程stu_grade更名为stu_g。
触发器试题
触发器试题
1、下列有关触发器的描述,错误的是(B)
A、触发器是一种特殊的存储过程,用户不能直接调用
B、触发器inserted表和deleted表有共同记录
C、触发器可以用来定义比check约束更复杂的规则
D、删除触发器可以哟弄DROP TRIGGER命令,也可以用管理平台操作
2、关于触发器的正确说法是(D)
A、D ML触发器控制表记录
B、DDL触发器实现数据库管理
C、D ML触发器不能控制所有数据完整性
D、触发器中的T-SQL代码在事件产生时执行
3、关于触发器的错误说法是(C)
A、游标一般用于存储过程
B、游标也可以用于触发器
C、应用程序也可以调用触发器
D、触发器一般是针对表
4、当触发器执行时,系统会创建临时表保存用户操作更改的行的新值和旧值,UPDATE操
作所涉及的旧值会被临时保存在(C)
A、u pdate表
B、inserted表
C、d eleted表
D、i nserted表和update表
5、如果有两个事物同时对数据库中同一数据进行操作,不会引起冲突的是(D)
A、一个DELETE和一个SELECT
B、一个SELECT和一个DELETE
C、两个UPDATE
D、两个SELECT
判断题
6、触发器基于一个表创建,但是可以针对多个表进行操作(对)
7、触发器(trigger)是一种特殊的存储过程(对)
8、触发器被定义以后,只有当用户调用它时才触发,用户不调用时,触发器不起作用(错)
9、可以根据完整性的需要,对某一个表定义SELECT触发器(错)
10、触发器主要是通过表操作事件进行触发而被执行的(对)。
SQL触发器习题.doc
SQL触发器习题(1) experiment task 1:1, create triggersIn the student information management system, student information table contains columns "Id", "name", "gender", "da te of bir th", "class"; the class informa tion t able con tains the list of "class", "class name" and "number"; the course information table contains a column "code", "the name of the course"; student achievement table contains the column "Id", "code", "achievement", has been used to ensure the achievement of constraints in the range of 0~100 points. (created with scripts in the appendix)一1) creates the INSERT trigger stu insert on student, which requires that when you insert a record in the student table (requiring only one record at a time), this trigger will update the class_mm columnin the class table. And test the trigger stu insert.Create trigger stu insertOn student for insertAsIf @@rowcount>lBeginRAISERROR (' You, cannot, insert, more, than, one, student, at, a, time. ' , 16,)ROLLBACK TRANReturnNote where return statements cannot be omitted, because after the ROLLBACK TRAN statement trigger script there will be the implemen tation of t hese stat emen ts, the stat emen ts, and to the subsequent statement execution must be added to the return statementEndUpdate classSet class_num=class_num+lWhere class_id= (select, classid, from, inserted)"Data update succeeded in print'class table"Go-Test 1Insert into studentSelect' 0601012',‘ Li ' , ' female ' , ' 1986-07T1' , ' 060T , union, allSelect' 0601013',‘ Mei ' , ' female ' , ' 1988-02-07' , ' 060T-Test 2Insert, into, student, values ('0602011',' Wen female','1986-09-21',' 0602')一2) modify the INSERT trigger stu insert created in Heading 1, which requires inserting multiple records in the student table (allowing multiple records to be inserted), which will update the class_mm column in the class table. And test the trigger stu insert.Alter trigger stu insertOn student for insertAsUpdate classSet class_num=c1ass_num+ (select count (class_id) from, inserted, where, class. class_id=inserted. class id)"Data update succeeded in print'class table"Go-Test 1Insert into studentSelect' 0601012',‘ Li ' , ' female ' , ' 1986-07T1' , ' 060T , union, allSelect' 0601013',‘ Mei ' , ' female ' , ' 1988-02-07' , ' 060Tupdate,-Test 2Insert, into, student, values ('0602011',' Wen female','1986-09-21',' 0602')一3) creates the DELETE trigger stu delete on student, requiring that the classnun column in the class table be updated when the record is deleted from the student table. And test the trigger stu_delete. Create trigger stu_deleteOn student for deleteAsUpdate class集 class_num = class_num - (select count (class id)从删除的 类。
触发器作业参考答案
--测试数据
insert into sc
values('09105102','003',92,null)
update sc
set grade=77
where sno='09105102' and cno='003'
close record --关闭游标
--测试数据
--多行更新
update spj
set qty=200
where sno='S2'and pno='p3';
触发器作业2参考答案:
(1)在学生选课数据库的SC关系中增加属性列Status,用来记录课程成绩的等级,0-59分为“不合格”,60-69为“合格”,70-89为“良好”,90以上为“优秀”。
while @@FETCH_STATUS=0
begin
update spj
set qty=300
from inserted,spj
where inserted.sno in (select sno from s where city='北京')
--测试数据
--单行插入与更新
insert into spj
values('S2','P1','J2',100);
insert into spj
values('S1','P1','J2',100);
update spj
set qty=200
where sno='S2'and pno='p5' and jno='J1';
触发器练习
触发器练习(一)1、画出图题5-1所示的RS 触发器输出端Q 、Q 端的波形,输入端S 与R 的波形如图所示。
(设Q 初始状态为0)S RSRSRQQ....图题5-12、画出图题5-2所示的RS 触发器输出端Q 、Q 端的波形,输入端S 与R 的波形如图所示。
(设Q 初始状态为0)S RS RQQ...SR....图题5-23、画出图题5-3所示的同步RS 触发器输出端Q 、Q 端的波形,输入端S 、R 与CLK 的波形如图所示。
(设Q 初始状态为0)C1S RS RQQ....CLKS RCLK...图题5-34、画出图题5-4所示的同步D 触发器输出Q 端的波形,输入端D 与CLK 的波形如图所示。
(设Q 初始状态为0)C1DDQQ....CLKDCLK..图题5-45、若在图5-5电路中的CP 、S 、R 输入端,加入如图4.27所示波形的信号,试画出其 Q 和Q端波形,设初态Q =0。
SRCP触发器练习(二)1、画出图题5-6所示的同步JK 触发器输出Q 端的波形,输入端J 、K 与CLK 的波形如图所示。
(设Q 初始状态为0)J KQQ..CLKJKCLK ......C11J 1K..图题5-62、画出图题5-6所示的边沿触发D 触发器输出端Q 端的波形,输入端D 与CLK的波形如图所示。
(设Q 初始状态为0)C11D D QQ....CLKDCLK...D QQ....CLKDCLK...C11D (1)(2)3、画出图题5-7所示的边沿D 触发器输出Q 端的波形,CLK 的波形如图所示。
(设Q 初始状态为0)C11D Q 1CLK....CLK.1C11D Q 2CLK .CLK .图题5-74、画出图题5-8所示的JK 触发器输出Q 端的波形,输入端J 、K 与CLK 的波形如图所示。
(设Q 初始状态为0)J KQQ....CLKJ KCLK ...C11J 1KJ KCLK ......图题5-85、试画出图题5-9所示T 触发器输出Q 端的波形,输入端CLK 的波形如图所示。
数据库触发器面试题
数据库触发器面试题1.触发器的作用?触发器是一类特殊的存储过程,主要是通过事件来触发而被执行的。
它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。
可以联级运算。
如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。
2,什么是存储过程?用什么来调用?存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需要创建一次,以后在该程序中就可以调用多次。
如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。
可以一个命令对象来调用存储过程。
3,索引的作用?它的优点缺点是什么?索引就是一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。
它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。
索引可以是唯一的,创建索引允许指定单个列或者是多个列。
缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。
4,事务的持续性是指?AA.事务一旦提交,对数据库的改变是永久的B.事务包括的所有操作要么都做,要么不做C.一个事务内部的操作及使用的数据对并发的其他事务是隔离的D.事务必须是使数据库从一个致性状态变到另一个致性状态解析:事务的持久性(也叫永久性)是指一旦事务提交成功,其对数据修改是持久性的。
数据更新的结果已经从内存转存到外部存储器上,此后即使发生了系统故障,已提交事务所做的数据更新也不会丢失。
5,以下哪个选项时DBMS的基本单位,是构成单一逻辑工作单元的操作集合 CA.进程B.SQLC.事务D.文件6,SQL语句性能分析的关键字是什么?AA.EXPLAINB.LOADC.TOPD.SUMexplain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。
sql数据库-触发器练习
《触发器练习》(cardID CHAR(10)primary key,--卡号customerName CHAR(8)NOT NULL,--顾客姓名currentMoney MONEY NOT NULL-- 当前余额)CREATE TABLE transInfo --交易信息表(cardID CHAR(10) NOT NULL, --卡号transType CHAR(4) NOT NULL, --交易类型(存入/支取)transMoney MONEY NOT NULL, --交易金额transDate DATETIME NOT NULL --交易日期默认为当天日期CONSTRAINT DF_transDate DEFAULT(getDate( )))GO/*--插入测试数据:张三开户,开户金额为1000 ;李四开户,开户金额1 ---*/INSERT INTO bank(customerName,cardID,currentMoney) V ALUES('张三','1001 0001',1000) INSERT INTO bank(customerName,cardID,currentMoney) V ALUES('李四','1001 0002',1)完成下列操作:1.建INSERT触发器:在交易信息表transInfo上创建插入触发器。
根据交易类型是支取/存入,减少或增加帐户表(bank)中对应卡号的余额,如果支取的金额小于1,则显示交易失败,撤销刚才的操作,否则修改信息表的信息。
程序代码:CREA TE TRIGGER transInfo_INSERTON transInfo AFTER INSERTASBEGINDECLARE @transMoney MONEY--交易金额DECLARE @CARD CHAR(10)--交易的卡号DECLARE @currentMoney MONEY--现金DECLARE @transType CHAR(4)--交易类型SET @transType=(SELECT transType FROM INSERTED)SET @transMoney=(SELECT transMoney FROM INSERTED)SET @CARD=(SELECT cardID FROM INSERTED)IF(@transType='存入')BEGINUPDA TE bank SET currentMoney=currentMoney+@transMoneyWHERE cardID=@CARDSET @currentMoney=(SELECT currentMoney FROM BANKWHERE cardID=@CARD)PRINT'交易成功!交易金额:'+CONVERT(CHAR,@transMoney)PRINT'卡号:'+@CARD+'余额:'+CONVERT(CHAR,@currentMoney)ENDELSE IF( @transType='支取')IF( @transMoney<1)BEGINPRINT'交易失败'ROLLBACK TRANSACTIONENDELSEBEGINUPDA TE bank SET currentMoney=currentMoney-@transMoneyWHERE cardID=@CARDSET @currentMoney=(SELECT currentMoney FROM BANKWHERE cardID=@CARD)SET @transMoney=-@transMoneyPRINT'交易成功!交易金额:'+CONVERT(CHAR,@transMoney)PRINT'卡号:'+@CARD+'余额:'+CONVERT(CHAR,@currentMoney)ENDEND测试数据:DELETE FROM transInfoSET NOCOUNT ONINSERT INTO transInfo(cardID,transType,transMoney)VALUES('1001 0001','支取',200)INSERT INTO transInfo(cardID,transType,transMoney)VALUES('1001 0002','存入',50000)运行结果:2.创建DELETE 触发器:在交易信息表transInfo上创建删除触发器,如果删除交易信息表的记录,将删除的记录备份到backupT able表中。
实验八 存储过程和触发器_参考答案
实验八存储过程和触发器一、目的与要求1. 正确理解存储过程和触发器的概念、功能和类型;2. 掌握使用SSMS和T-SQL语句创建和管理存储过程和触发器。
二、上机准备利用教师提供的XSGL数据库,该库中有3个表:student,course,sc。
三、实验内容1. 将教师提供的XSGL数据库附加到本地数据库中。
2. 分别使用SSMS和T-SQL语句创建和管理存储过程和触发器。
(1)创建一个存储过程proc_stud_sc_info,查询学号、姓名、性别、系、课程号和成绩等信息。
use xsglgocreate procedure proc_stud_sc_infoasselect student.sno,sname,sex,dept,cno,gradefrom student left join scon student.sno=sc.snogo(2)创建一个存储过程proc_stud_info,根据输入的学号,查询学生的基本信息。
use xsglgocreate procedure proc_stud_info@sno char(5)='95001'asselect *from studentwhere sno=@snogo(3)创建一个存储过程proc_stud_birth_year,根据输入的学生姓名,计算该学生的出生年份。
use xsglgocreate procedure proc_stud_birth_year@sname varchar(6)='张立'asselect sname,year(getdate())-age as 出生年份from studentwhere sname=@snamego(4)创建一个存储过程proc_GetAvgScByCno,根据输入的课程号返回该课程的平均成绩。
use xsglgocreate procedure proc_GetAvgScByCno@cno char(3)='1'asselect @cno as 课程号,avg(grade) as 平均成绩from scwhere cno=@cnogo或use xsglgocreate procedure proc_GetAvgScByCno@cno char(3)='1',@aver smallint outputasselect @aver=avg(grade)from scwhere cno=@cnogo(5)创建一个Insert触发器tri_StudentInsert,当向student表插入一条记录时,向客户端显示一条“您正在插入学生的数据”的信息。
单元测试题(第9章 触发器)-有答案
单元测试题一、选择题(每题10分,共100分)1. 当对表进行哪项操作时触发器不会自动执行()。
A.selectB.insertC.updateD.delete答案:A2. 设某数据库在非工作时间(每天8:00以前、18:00以后、周六和周日)不允许授权用户在职工表中插入数据。
下列方法中能够实现此需求且最为合理的是()A.建立存储过程B.建立后触发型触发器C.定义内嵌表值函数D.建立前触发型触发器答案:D3. 下列关于MySQL中前触发器的说法,正确的是()。
A.在前触发器执行之后,再执行引发触发器执行的数据操作语句B.定义前触发器使用的选项是FORC.在一个表上只能定义一个前触发器D.在一个表上针对同一个数据操作只能定义一个前触发器答案:D4. 设在MySQL中有如下定义触发器的语句:CREATE TRIGGER tr_updateStuScoreAFTER UPDATEON scoreFOR EACH ROW……下列关于该触发器作用的说法,正确的是()。
A.在score表上定义了一个由数据更改操作引发的前触发型触发器B.在score表上定义了一个由数据更改操作引发的后触发型触发器C.在score表上定义了一个由数据增、删、改操作引发的后触发型触发器D.在score表上定义了一个由数据增、删、改操作引发的前触发型触发器答案:B5. 以下对触发器的叙述中,不正确的是()A.触发器可以传递参数B.触发器是SQL语句的集合C.用户不能调用触发器D.可以通过触发器来强制实现数据的完整性和一致性答案:A6. 创建触发器使用哪个命令()A.CREATE TABLEB.CREATE TRIGGERC.CREATE ENGINED.CREATE VIEW答案B7. 删除触发器使用哪个命令()A.ALTERB.DELETEC.DROPD.REMOVE答案:C8.查看指定数据库中已存在的触发器语句、状态等信息,使用( )A.ALTER TRIGGERSB.SELECT TRIGGERSC.DISPLAY TRIGGERSD.SHOW TRIGGERS答案:D9.表示前触发使用的关键词是()A.FRONTB.AFTERC.AHEADD.BEFORE答案:D10.下列是数据库对象的有哪些(可多选)()A. 视图B. 触发器C. 索引D. 存储过程答案:ABCD。
数据库实验9答案
(1) 设置一个触发器,该触发器仅允许“dbo”用户可以删除Employee表内数据,否则出错。
create trigger EmploteeDelete on employeefor deleteasif exists (select * from deleted)beginif user!='dbo'rollbackend(2) 在OrderMaster表中创建触发器,插入数据时要先检查Employee表中是否存在同样值的业务员编号,如果不存在则不允许插入。
create trigger insOrderMasteron OrderMasterfor insertasbeginif exists(select*from insertedwhere salerNo not in(select employeeNofrom Employee))rollback;end(3) 级联更新:当更新Customer表中customerNo列的值时,同时更新OrderMaster 表中的customerNo列的值,并且一次只能更新一行。
create trigger uptCustomeron Customerfor updateasdeclare @oldCustomerNo char(9),@newCustomerNo char(9)if(select count(*)from inserted)>1rollbackelsebeginif update(customerNo)beginselect @oldCustomerNo=customerNo from deletedselect @newCustomerNo=customerNo from insertedupdate OrderMaster set customerNo=@newCustomerNowhere customerNo=@oldCustomerNoendend(4) 对Product表写一个UPDATE触发器。
触发器试题——精选推荐
一、选择题(每题2分,共10题)1: 一位十六进制数可以用( )位二进制数来表示。
A. 1B. 2C. 4D. 16 2: 逻辑函数B A F ⊕= 和 G=A ⊙B 满足关系( )相等。
A. G F = B. G F =' C. G F = D. G F =3. 三态门输出高阻状态时, 是不正确的说法。
A.用电压表测量指针不动B.相当于悬空C.电压不高不低D.测量电阻指针不动4:要用n 位二进制数为N 个对象编码,必须满足( )。
A N = 2n B N ≥ 2n C N ≤ 2n D N = n5:串行加法器的进位信号采用( )传递,并行加法器的进位信号采用( )传递。
A 超前,逐位 B 逐位,超前 C 逐位,逐位 D 超前,超前6:存在一次变化问题的触发器是( )。
A RS 触发器B D 触发器C 主从JK 触发器D 边沿JK 触发器7.同步计数器和异步计数器比较,同步计数器的显著优点是( )。
工作速度高 B.触发器利用率高 C.电路简单 D.不受时钟C P 控制8.下列逻辑电路中为时序逻辑电路的是( )。
A.变量译码器B.加法器C.数码寄存器D.数据选择器9. N 个触发器可以构成能寄存( )位二进制数码的寄存器。
A.N -1 B.N C.N +1 D.2N10:想选一个中等速度,价格低廉的A/D 转换器,下面符合条件的是( )。
A 逐次逼近型 B 双积分型C 并联比较型D 不能确定二、填空题(每题1分,共10题)1: 若用二进制代码对48个字符进行编码,则至少需要 ( )位二进制数。
2:己知逻辑函数AC C B A Y +=,约束条件为C B =0,则卡诺图中有( )个最小项,有( )个无关项。
3.TTL 与非门的关门电平为0.8V ,开门电平为2V ,当其输入低电平为0.4V ,高电平为3.2V 时,其输入低电平噪声容限U NL = ( ) ;输入高电平噪声容限为U NH = ( ) 。
实验6 大数据库实验——存储过程和触发器
实验6 存储过程和触发器一、实验目的1、加深和巩固对存储过程和触发器概念的理解。
2、掌握触发器的简单应用。
3、掌握存储过程的简单应用。
二、实验容一)存储过程:1. 创建一存储过程,求l+2+3+…+n,并打印结果。
CREATE PROCEDURE addresultASDECLARE n int=10,/*最后一个数*/i int=0,result int=0 /*结果*/BEGINWHILE(i<=n)BEGINSET result=result+iSET i=i+1ENDPRINT'1+2+3+...+n的结果是:'PRINT resultRETURN(result)ENDGO2.调用上面的addresult存储过程,打印l十2+3+…+10的结果。
EXEC addresult3. 修改上述存储过程为addresult1,使得n为输入参数,其具体值由用户调用此存储过程时指定。
CREATE PROCEDURE addresult1n int=10 /*最后一个数*/ASDECLARE i int=0,result int=0 /*结果*/BEGINWHILE(i<=n)BEGINSET result=result+iSET i=i+1ENDPRINT'1+2+3+...+n的结果是:'PRINT resultRETURN(result)ENDGO4. 调用上面修改后的addresult1存储过程,打印l+2+3+…+100的结果。
EXEC addresult1 1005.修改上述存储过程为addresult2,将n参数设定默认值为10,并改设sum为输出参数,让主程序能够接收计算结果。
CREATE PROCEDURE addresult2n int=10,/*最后一个数*/sum int out/*结果*/ASDECLARE i int=0BEGINset sum=0WHILE(i<=n)BEGINSET sum=sum+iSET i=i+1ENDENDGO6.调用上面修改后的addresult2存储过程,设置变量s接收计算l+2+3+…+10的结果。
触发器试题
1、下列有关触发器的描述,错误的是(B)
A、触发器是一种特殊的存储过程,用户不能直接调用
B、触发器inserted表和deleted表有共同记录
C、触发器可以用来定义比check约束更复杂的规则
D、删除触发器可以哟弄DROP TRIGGER命令,也可以用管理平台操作
2、关于触发器的正确说法是(D)
A、D ML触发器控制表记录
B、DDL触发器实现数据库管理
C、D ML触发器不能控制所有数据完整性
D、触发器中的T-SQL代码在事件产生时执行
3、关于触发器的错误说法是(C)
A、游标一般用于存储过程
B、游标也可以用于触发器
C、应用程序也可以调用触发器
D、触发器一般是针对表
4、当触发器执行时,系统会创建临时表保存用户操作更改的行的新值和旧值,UPDATE操
作所涉及的旧值会被临时保存在(C)
A、u pdate表
B、inserted表
C、d eleted表
D、i nserted表和update表
5、如果有两个事物同时对数据库中同一数据进行操作,不会引起冲突的是(D)
A、一个DELETE和一个SELECT
B、一个SELECT和一个DELETE
C、两个UPDATE
D、两个SELECT
判断题
6、触发器基于一个表创建,但是可以针对多个表进行操作(对)
7、触发器(trigger)是一种特殊的存储过程(对)
8、触发器被定义以后,只有当用户调用它时才触发,用户不调用时,触发器不起作用(错)
9、可以根据完整性的需要,对某一个表定义SELECT触发器(错)
10、触发器主要是通过表操作事件进行触发而被执行的(对)。
经典触发器练习题
经典触发器练习题alter table 表alter column 要修改的字段 varchar(20) 修改字段的长度alter table xueshengbiao add nl varchar(4) 增加nl字段update 表名 set 列名=新值 where 列名=旧值有条件的修改delete from xueshengbiao where nl>=17 and nl<19 有条件的删除insert into xueshengbiao(xuehao,aiaho,mz,nl,xm)values('003','pashan','','17' ,'ww') 添加数据select b.id,xm,kecheng from kcb a,xueshengbiao b wherea.glxsid=b.xuehao 表与表关联的左右查询1.创建存储过程P_1,功能是查询性别为男的学生的学号,姓名,性别。
create proc p_1(@xb char(2))asselect 学号,姓名,性别from 学生where 性别=@xbexecute p_1 '男'2.创建存储过程P_2,功能是查询指定学生的学号,姓名,性别和班级,姓名由参数传递。
create proc p_2(@xm char(8))asselect 学号,姓名,性别from 学生where 姓名=@xmexecute p_2 '张三'3.创建存储过程P_3,功能是查询某门课程的学生成绩,显示学号,姓名,课程名,成绩,并将成绩转换为等级分制。
课程名由参数传递。
create proc p_3(@kcm char(20),@cj int output)asselect 学生.学号,姓名,课程名,casewhen 成绩<60 then '不及格'when 成绩>=60 and 成绩<70 then '及格'when 成绩>=70 and 成绩<80 then '比较好'when 成绩>=80 and 成绩<90 then '良好'when 成绩>=90 then '优秀'end as 成绩from 学生,选课,课程where 选课.课程号=课程.课程号and 学生.学号=选课.学号and 课程名=@kcmdeclare @i intexecute p_3 计算机基础,@i outputprint @i4.创建存储过程P_4,功能是查询某门课程的总分和平均分,将返回参数。
实验15 触发器(答案)
实验15:触发器课时安排:2学时实验要求:掌握触发器创建语法掌握触发器工作机制实验原理:掌握触发器创建语法掌握触发器工作机制实验步骤:1、在course表中创建触发器,测试inserted表和deleted表2、创建触发器tri_stuinfo,实现当在stu_info表中插入一新学生的同时修改班级表中的人数。
3、创建触发器tri_class,实现当修改班级表中的班级人数同时修改系表中系的人数。
create trigger tri_classon classfor updateasif update(class_rs)beginupdate departmentset dept_rs=dept_rs-(select class_rs from deleted)+(select class_rs from inserted)where dept_id=(select dept_id from inserted)end--测试update classset class_rs=14where class_id='c01'4、创建触发器tri_score,如果将不及格的成绩做修改时,给出提示信息‘不及格成绩不允许修改’并取消操作create trigger tri_scoreon stu_scorefor updateasif update(score)begindeclare @score intselect @score=score from deletedif @score<60beginrollback tranraiserror('不及格成绩不允许修改',16,1)endend5、创建触发器tri_del,实现当删除学生表中某个学生的记录时,对应学生成绩表中所有有关此学生的记录均删除。
create trigger tri_stu_info_scoreon stu_infoinstead of deleteas--取消约束alter table stu_scorenocheck constraint fk_stu_score_stu_info--删除数据delete from stu_scorewhere s_id=(select s_id from deleted)delete from stu_infowhere s_id=(select s_id from deleted)--恢复约束alter table stu_scorewith check check constraint fk_stu_score_stu_infogo6、在数据库student中创建触发器tri_check_update,如果修改stu_score表的学号,课程号以及成绩时,给出提示信息,并取消修改操作。
(2版)数据库实验11存储过程触发器及答案
(2版)数据库实验11存储过程触发器及答案数据库原理与应用实验实验十一存储过程与触发器一、实验目的及要求本实验主要目的是掌握存储过程的创建及使用方式、触发器的创建,具体要求有:●理解存储过程的概念及类型,深刻理解存储过程的优点。
●掌握创建各种存储过程的方法,掌握调用存储过程的方法。
●理解触发器的概念与类型。
●理解触发器的功能及工作原理。
●掌握创建、更改、删除触发器的方法。
●理解利用触发器维护数据完整性的方法。
二、实验原理及背景知识(一)存储过程知识存储过程是一种数据库对象,将执行计划存储在数据库服务器中。
它的运行速度比独立运行同样的程序要快。
1、存储过程类型(1)系统存储过程存储在master数据库中,其名称以sp_为前缀。
可以在其他数据库中调用。
(2)用户自定义存储过程由用户创建并能完成某一特定功能的存储过程,也称本地存储过程。
2、创建存储过程存储过程的三个组成部分:(1)所有的输入参数以及传给调用者的输出参数。
(2)被执行的针对数据库的操作语句,包括调用其他存储过程的语句。
(3)返回给调用者的状态值,以指明调用是成功还是失败。
3、T-SQL创建存储过程的基本语法格式CREATE PROC[EDURE] 存储过程名称参数定义AS SQL语句(二)触发器知识触发器是一种特殊类型的存储过程,主要通过事件进行触发执行的。
可以实现由主键和外键所不能保证的参照完整性和数据一致性;强化约束;跟踪变化;级联运行;存储过程的调用等功能。
1、触发器的种类(1)AFTER触发器:只有对表执行某一操作后,才能被触发。
可以为表的同一操作定义多个触发器,其触发次序可使用sp_settriggerorder来完成。
(2)INSTEAD OF触发器:不执行其触发操作,仅执行触发器本身,对同一触发操作只能定义一个INSTEAD OF触发器。
2、Inserted和Deleted临时表插入一行时,Inserted表保存了一份插入行的拷贝。
实验6触发器答案
《数据库系统概论》实验报告6题目:TRIGGER 姓名学号日期实验目的1、掌握和使用企业管理器创建、修改、删除触发器2、掌握和使用sql创建、修改、删除触发器3、掌握触发器的执行实验内容:1、用企业管理器为表s创建一级联更新触发器trigger_s,要求:若修改s表中一学生的学号,则表sc中与该学生相关的学号自动修改CREATE TRIGGER trigger_s ON sFOR UPDATEASif UPDATE(sno)begindeclare @sno_new char(10),@sno_old char(10)select @sno_new=sno from insertedselect @sno_old=sno from deletedupdate sc set sno=@sno_new where sno=@sno_oldend2、用企业管理器为表sc创建一限制更新触发器trigger_sc,要求:若修改sc表中一学生的学号,则要检查表s中是否存在与该学生相同的记录,若有则不许修改,若没有则可以。
CREATE TRIGGER trigger_sc ON scFOR uPDATEASif update(sno)begindeclare @sno_new char(10),@SNO_OLD CHAR(10),@SNO_CNT INTSELECT @SNO_OLD=SNO FROM DELETEDSELECT @SNO_CNT=COUNT(*) FROM S WHERE SNO=@SNO_OLDIF @SNO_CNT<>0ROLLBACK TRANSACTIONEND3、用sql为表ss创建一触发器trigger_sc_tri,要求:当插入记录或修改成绩时,确保此记录的成绩在0到100之间。
USE STUDENTGOCREATE TRIGGER SCORE_SC_TRION SC FOR INSERT,UPDA TEASDECLARE @SCORE_READ TINYINTSELECT @SCORE_READ=SCORE FROM INSERTEDIF @SCORE_READ>=0 AND @SCORE_READ <=100BEGINPRINT 'CAOZUOCHENGGONG!'RETURNENDPRINT 'CHENGJI NOT IN 0-100'ROLLBACK TRANSACTIONGO4、用sql为表c创建一级联删除触发器trigger_dc,要求:通过课程名从表c中则删除某课程信息,同时删除表sc中与此课程相关的选课记录。
数据库实验触发器题目
/*1一个用于跟踪哪个用户、何时间更新了Account表的balance*/create table trigger_account(account_number char(10),branch_name char(15),userOfUpdate char(16) null,timeOfUpdate DA TETIME NULL,balance_old numeric(12,2) NULL,balance_new numeric(12,2) NULL)CREA TE TRIGGER modify_account ON account AFTER UPDA TEASIF UPDA TE(balance)BEGINDECLARE @balance_newnumeric(12,2)DECLARE @balance_oldnumeric(12,2)DECLARE @account_numberchar(10)DECLARE @branch_namechar(15)SELECT @balance_old=(SELECT balance FROM deleted)SELECT @balance_new=(SELECT balance FROM inserted)SELECT @account_number=(SELECT account_number FROM deleted)SELECT @branch_name=(SELECT branch_name FROM deleted)INSERT INTO trigger_accountV ALUES(@account_number,@branch_name,USER_NAME(),GETDA TE(),@bal ance_old,@balance_new)END/*检验*/--插入数据insert into branch values('建设银行','烟台',1883333338)insert into account values('22222222','建设银行',100000)--检验update account set balance=150000 where account_number='22222222'select * from trigger_account/*2.另一个用于跟踪哪个用户、何时间更新了loan表的amount*/create table trigger_loan(loan_number char(10),branch_name char(15),userOfUpdate char(16) null,timeOfUpdate DA TETIME NULL,amount_old numeric(12,2) NULL,amount_new numeric(12,2) NULLCREA TE TRIGGER modify_loan ON loan AFTER UPDA TEASIF UPDA TE(amount)BEGINDECLARE @amount_newnumeric(12,2)DECLARE @amount_oldnumeric(12,2)DECLARE @loan_numberchar(10)DECLARE @branch_namechar(15)SELECT @loan_number=(SELECT loan_number FROM deleted)SELECT @amount_old=(SELECT amount FROM deleted)SELECT @amount_new=(SELECT amount FROM inserted)INSERT INTO trigger_loanV ALUES(@loan_number,@branch_name,USER_NAME(),GETDA TE(),@amount_ol d,@amount_new)END/*检验*/--插入数据insert into branch values('烟台银行','烟台',100000000)insert into loan values('11111111','烟台银行',100000)--检验update loan set amount=150000 where loan_number='11111111'select * from trigger_loan/*3.当Branch表的city为NULL时,一律写成“presently uncertain”*/create trigger city_null on branch for insert,updateasdeclare @city char(30)declare @name char(15)select @city=(select branch_city from inserted)select @name=(select branch_name from inserted)if @city='NULL'beginupdate branch set branch_city='presently uncertain' where branch_name=@nameend/*验证*/insert into branch values('中国人民银行','null',122222)/*插入验证*/select * from branchinsert into branch values('中国华夏银行','烟台',2881991991)update branch set brach_city='null' where branch_name='中国华夏银行'/*更新验证*/select * from branch/*************************课本作业************************************************************//*************第一题:当branch中branch_city为null时更名为unknow**********/create trigger cityNull1 on branch for insert,updateasdeclare @city char(30)declare @name char(15)select @city=(select branch_city from inserted)select @name=(select branch_name from inserted)if @city='NULL'beginupdate branch set branch_city='unknow' where branch_name=@nameend/*验证*/insert into branch values('中国农业银行','null',11122222)/*插入验证*/select * from branchinsert into branch values('邮政储蓄银行','烟台',2881991991)update branch set branch_city='null' where branch_name='邮政储蓄银行'/*更新验证*/ select * from branch/*第二题仓库库存问题*********************************************/ create trigger reorder_trigger on inventory for updateas if update(levels)begindeclare @level_old numeric(12,2)declare @level_new numeric(12,2)declare @item char(10)declare @amount numeric(12,2)select @level_old=(select levels from deleted)select @level_new=(select levels from inserted)select @item=(select item from deleted)select @amount=(select amount from reorder where reorder.item=@item)if (@level_new<=(select levels from minlevel where minlevel.item=@item)and @level_old>(select levels from minlevel where minlevel.item=@item) )insert into orders values(@item,@amount)end/*验证*/insert into inventory values('原料x',60)insert into minlevel values('原料x',50)insert into reorder values('原料x',100)update inventory set levels=20 where item='原料x'select * from orders/*第三题:银行处理透支情况*********************/create trigger overdraft_trigger on account for updateas if update(balance)declare @account_num char(10)declare @balance_new numeric(12,2)select @account_num=(select account_number from deleted)select @balance_new=(select balance from inserted)if(@balance_new<0)begininsert into loan select account_number,branch_name,-balancefrom account where account_number=@account_numinsert into borrower select * from depositor where account_number=@account_numupdate account set balance=0 where account_number=@account_numend/*检验*/insert into account values('1111110','民生银行',1000)insert into customer values('Jom','烟台','南大街')insert into branch values('民生银行','烟台','1000000000')insert into depositor values('Jom','1111110')update account set balance=-1000 where account_number='1111110'select * from loanselect * from account/*第四题:在对账号执行delete操作时,对账号的每一个拥有者,检查他是否有其他账户,如果没有,把他从depositor中删除*/create trigger dele_depositor_trigger on account instead of deleteasbegindeclare @account_num char(10)select @account_num=(select account_number from deleted)delete from depositor where account_number=@account_numdelete from depositor where account_number=@account_numend--验证insert into account values('1111110','民生银行',1000)insert into customer values('Join','烟台','南大街')insert into account values('12222222', '民生银行',10000)insert into account values('13333333', '民生银行',10000)insert into depositor values('Join','12222222' )insert into depositor values('Join','13333333' )insert into customer values('Bob','烟台','南大街')insert into account values('4444444444', '民生银行',10000)insert into depositor values('Bob','4444444444' )delete from account where account_number='12222222'delete from account where account_number='4444444444'。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*1一个用于跟踪哪个用户、何时间更新了Account表的balance*/create table trigger_account(account_number char(10),branch_name char(15),userOfUpdate char(16) null,timeOfUpdate DA TETIME NULL,balance_old numeric(12,2) NULL,balance_new numeric(12,2) NULL)CREA TE TRIGGER modify_account ON account AFTER UPDA TEASIF UPDA TE(balance)BEGINDECLARE @balance_newnumeric(12,2)DECLARE @balance_oldnumeric(12,2)DECLARE @account_numberchar(10)DECLARE @branch_namechar(15)SELECT @balance_old=(SELECT balance FROM deleted)SELECT @balance_new=(SELECT balance FROM inserted)SELECT @account_number=(SELECT account_number FROM deleted)SELECT @branch_name=(SELECT branch_name FROM deleted)INSERT INTO trigger_accountV ALUES(@account_number,@branch_name,USER_NAME(),GETDA TE(),@bal ance_old,@balance_new)END/*检验*/--插入数据insert into branch values('建设银行','烟台',1883333338)insert into account values('22222222','建设银行',100000)--检验update account set balance=150000 where account_number='22222222'select * from trigger_account/*2.另一个用于跟踪哪个用户、何时间更新了loan表的amount*/create table trigger_loan(loan_number char(10),branch_name char(15),userOfUpdate char(16) null,timeOfUpdate DA TETIME NULL,amount_old numeric(12,2) NULL,amount_new numeric(12,2) NULLCREA TE TRIGGER modify_loan ON loan AFTER UPDA TEASIF UPDA TE(amount)BEGINDECLARE @amount_newnumeric(12,2)DECLARE @amount_oldnumeric(12,2)DECLARE @loan_numberchar(10)DECLARE @branch_namechar(15)SELECT @loan_number=(SELECT loan_number FROM deleted)SELECT @amount_old=(SELECT amount FROM deleted)SELECT @amount_new=(SELECT amount FROM inserted)INSERT INTO trigger_loanV ALUES(@loan_number,@branch_name,USER_NAME(),GETDA TE(),@amount_ol d,@amount_new)END/*检验*/--插入数据insert into branch values('烟台银行','烟台',100000000)insert into loan values('11111111','烟台银行',100000)--检验update loan set amount=150000 where loan_number='11111111'select * from trigger_loan/*3.当Branch表的city为NULL时,一律写成“presently uncertain”*/create trigger city_null on branch for insert,updateasdeclare @city char(30)declare @name char(15)select @city=(select branch_city from inserted)select @name=(select branch_name from inserted)if @city='NULL'beginupdate branch set branch_city='presently uncertain' where branch_name=@nameend/*验证*/insert into branch values('中国人民银行','null',122222)/*插入验证*/select * from branchinsert into branch values('中国华夏银行','烟台',2881991991)update branch set brach_city='null' where branch_name='中国华夏银行'/*更新验证*/select * from branch/*************************课本作业************************************************************//*************第一题:当branch中branch_city为null时更名为unknow**********/create trigger cityNull1 on branch for insert,updateasdeclare @city char(30)declare @name char(15)select @city=(select branch_city from inserted)select @name=(select branch_name from inserted)if @city='NULL'beginupdate branch set branch_city='unknow' where branch_name=@nameend/*验证*/insert into branch values('中国农业银行','null',11122222)/*插入验证*/select * from branchinsert into branch values('邮政储蓄银行','烟台',2881991991)update branch set branch_city='null' where branch_name='邮政储蓄银行'/*更新验证*/ select * from branch/*第二题仓库库存问题*********************************************/ create trigger reorder_trigger on inventory for updateas if update(levels)begindeclare @level_old numeric(12,2)declare @level_new numeric(12,2)declare @item char(10)declare @amount numeric(12,2)select @level_old=(select levels from deleted)select @level_new=(select levels from inserted)select @item=(select item from deleted)select @amount=(select amount from reorder where reorder.item=@item)if (@level_new<=(select levels from minlevel where minlevel.item=@item)and @level_old>(select levels from minlevel where minlevel.item=@item) )insert into orders values(@item,@amount)end/*验证*/insert into inventory values('原料x',60)insert into minlevel values('原料x',50)insert into reorder values('原料x',100)update inventory set levels=20 where item='原料x'select * from orders/*第三题:银行处理透支情况*********************/create trigger overdraft_trigger on account for updateas if update(balance)declare @account_num char(10)declare @balance_new numeric(12,2)select @account_num=(select account_number from deleted)select @balance_new=(select balance from inserted)if(@balance_new<0)begininsert into loan select account_number,branch_name,-balancefrom account where account_number=@account_numinsert into borrower select * from depositor where account_number=@account_numupdate account set balance=0 where account_number=@account_numend/*检验*/insert into account values('1111110','民生银行',1000)insert into customer values('Jom','烟台','南大街')insert into branch values('民生银行','烟台','1000000000')insert into depositor values('Jom','1111110')update account set balance=-1000 where account_number='1111110'select * from loanselect * from account/*第四题:在对账号执行delete操作时,对账号的每一个拥有者,检查他是否有其他账户,如果没有,把他从depositor中删除*/create trigger dele_depositor_trigger on account instead of deleteasbegindeclare @account_num char(10)select @account_num=(select account_number from deleted)delete from depositor where account_number=@account_numdelete from depositor where account_number=@account_numend--验证insert into account values('1111110','民生银行',1000)insert into customer values('Join','烟台','南大街')insert into account values('12222222', '民生银行',10000)insert into account values('13333333', '民生银行',10000)insert into depositor values('Join','12222222' )insert into depositor values('Join','13333333' )insert into customer values('Bob','烟台','南大街')insert into account values('4444444444', '民生银行',10000)insert into depositor values('Bob','4444444444' )delete from account where account_number='12222222'delete from account where account_number='4444444444'。