第7章 存储过程和触发器
MySQL中的触发器和存储过程的区别与用途
MySQL中的触发器和存储过程的区别与用途MySQL是一种常用的关系型数据库管理系统,广泛应用于各种互联网应用中。
在MySQL中,触发器(Trigger)和存储过程(Stored Procedure)是两种常见的编程方式,用于实现数据库操作的自动化和业务逻辑的封装。
本文将探讨MySQL中的触发器和存储过程的区别和用途。
一、触发器触发器是MySQL中一种特殊的数据库对象,它和数据库表关联,并在表中的指定事件发生时自动执行特定的操作。
触发器是基于事件驱动的,它可以在数据插入、更新或删除时触发执行相应的操作。
1. 触发器的创建在MySQL中,创建触发器需要使用CREATE TRIGGER语句,并指定触发时机、触发事件、触发操作和触发操作所执行的SQL语句。
例如,我们可以创建一个在数据插入前触发的触发器如下所示:```CREATE TRIGGER before_insert_triggerBEFORE INSERT ON table_nameFOR EACH ROWBEGIN-- 触发操作所执行的SQL语句...END;```2. 触发器的用途触发器可以用于各种场景,例如数据自动更新、数据约束、数据一致性等。
下面以一个实例来说明触发器的用途。
假设我们有一个订单表和一个库存表,每当有订单数据插入时,我们希望自动更新库存表中对应商品的库存数量。
这时,就可以使用触发器实现该功能。
```CREATE TRIGGER update_inventoryAFTER INSERT ON ordersFOR EACH ROWBEGINUPDATE inventorySET quantity = quantity - NEW.amountWHERE product_id = NEW.product_id;END;```在上述示例中,我们创建了一个名为update_inventory的触发器,它在订单表插入数据后触发,然后执行更新库存表的操作。
SQL Server 2012 数据库教程第7章 存储过程和触发器
① 存储过程:存储过程保存T-SQL语句集合,可以接收和返回用户提供的参 数。
② CLR存储过程:CLR存储过程是对Microsoft .NET Framework公共语言运行时 (CLR)方法的引用,可以接收和返回用户提供的参数。
则创建完成,如图7.4所示。
2.执行存储过程 在pxscj数据库的“存储过程”目录下选择要执行的存储过程,如 student_info1,右键单击鼠标,选择“执行存储过程”菜单项。在弹出的“执行 过程”窗口中会列出存储过程的参数形式,如果“输出参数”栏为“否”,则表
以下命令的执行结果与上面的相同:
EXECUTE student_info1 @name='王林', @cname='计算机基础'
或者: DECLARE @proc char(20) SET @proc= 'student_info1' EXECUTE @proc @name='王林', @cname='计算机基础'
接下来执行存储过程do_action来查看结果: DECLARE @str char(8) EXEC dbo.do_action 0, @str OUTPUT SELECT @str; 执行结果显示“修改成功”。
Hale Waihona Puke 4)使用带有通配符参数的存储过程【例7.4】 从3个表的连接中返回指定学生的学号、姓名、所选课程名称及该
在如下的批处理中,声明一个局部游标变量,执行上述存储过程,并将游标 赋值给局部游标变量,然后通过该游标变量读取记录。
存储过程和触发器实验心得
存储过程和触发器实验心得1、PLSQL创建储存过程编译出错不会给出错误提示,导致调用时提示储存过程处于无效状态。
解决方案:使用SQLPLUS,不过SQLPLUS只会提示编译错误,不会提示具体原因,还可以使用Navicat工具,Navicat会给出更加详细的错误原因。
2、创建储存过程时,设置变量参数类型时,指定了字符长度导致创建失败。
解决方案:直接设置变量数据类型,不设置其字符长度。
3、使用TO_DATE(SYSDATE,‘YYYY/MM/DD’)获取当前日期作为借阅日期导致调用借书储存过程失败,提示参数类型错误。
解决方案:因为TO_DATE()函数是将字符类型转换成日期类型,而SYSDATE本来就是日期类型,所以导致调用失败,使用TO_DATE(TO_CHAR(SYSDATE,‘YYYY/MM/DD’),‘YYYY/MM/DD ’)将SYSDATE转换成字符类型再转换成日期类型。
4、使用DBMS_OUTPUT.PUT_LINE()函数输出提示,没有反应。
解决方案:在SQLPLUS中需要先使用SET SERVEROUTPUT ON;打开输出模式才能看见输出,而在PLSQL中输出的内容在另一个Output窗口中,而不是没有反应。
5、创建自动递增借阅流水号的触发器时,使用NEW关键字改变借阅流水号,导致创建触发器失败,解决方案:使用NEW关键字时,需要在前面加一个“:”号,如“:NEW.借阅流水号”。
6、调用修改后的借书储存过程时,发送错误,提示违反唯一约束条件以及COMMIT;不能再触发器中使用。
解决方案:删除在触发器中的COMMIT;,然后删除序列“借阅流水号序列”,重新创建序列“借阅流水号序列”,并且设置初始值为8,因为借阅表中已经有借阅流水号1到7的数据了,然后创建序列时未指定初始值,序列默认从1开始,导致违反唯一约束条件,从而导致调用储存过程失败。
四、实验心得体会通过本次实验,学会了储存过程以及触发器和序列的使用方法,对存储过程有了一个直观的认识,对触发器的工作原理和作用有了更加深刻的认识,使用触发器可以在修改数据前后规范数据,使数据规范化和标准化。
存储过程与触发器
9.1.3
创建、执行、修改、删除简单存储过程
简单存储过程即不带参数的存储过程,下面介绍简单存储过程 的创建及使用。
1. 创建简单存储过程
在SQL Server中通常可以使用两种方法创建存储过程:一 种是使用企业管理器创建存储过程。另一种是使用查询分 析器执行SQL语句创建存储过程。创建存储过程时,需要注 意下列事项:
图9-1 创建存储过程的界面
(2)使用SQL语句创建存储过程。在查询分析器中,用SQL语 句创建存储过程的语法格式如下: CREATE PROC [EDURE] procedure_name [;number] [{@parameter data_type} [VARYING] [=default] [OUTPUT] ][,…n] [WITH {RECOMPLE|ENCRYPTION|RECOMPLE,ENCRYPTION}] [FOR REPLICATION] AS sql_statement [,…n] 其中: ● procedure_name是新建存储过程的名称,其名称必须遵 守标识符命名规则,且对于数据库及其所有者必须唯一。 ● number是可选的整数,用来对同名的过程分组,以便用一 条DROP PROCEDURE语句即可将同组的过程一起删除。例如, 名为order的应用程序使用的过程可以命名为orderproc1、 orderproc2、orderproc3。DROP PROCEDURE orderproc语句 将删除整个组。如果名称中包含定界标识符,则数字不应该包含 在标识符中,只应在存储过程名前后使用适当的定界符。
【例9.3】在查询分析器中执行ST_PRO_BJ。 代码如下: USE student EXECUTE ST_PRO_BJ GO 其执行结果如图9-2所示。
触发器获奖课件
END IF; END trigger_emp;
❖ SQL> UPDATE employees SET salary=1000;
12
7.2.2 语句级触发器
❖ 使用触发器谓词
假如触发器响应多种DML事件,而且需要根据事 件旳不同进行不同旳操作,则能够在触发器体中 使用谓词判断是哪个触发事件触动了触发器。
❖ 【例7-6】创建一种带限制条件旳UPDATE 触发器,修改雇员旳工资时,只输出80号部 门雇员修改前工资旳值与改后旳工资旳值。
❖ 见书94页【例7-6】
22
7.2.3 行级触发器
❖ 【 例 7-7】 创 建 一 种 行 级 触 发 器 , 当 向 departments表中插入数据时,将插入后旳 值 写 入 到 deptlog 日 志 表 中 , 当 删 除 departments数据时,将被删除前旳值写入 到日志表中,当对departments表中某一列 进行更新时,将更新前和更新后旳值写入到 日志表中。
17
7.2.3 行级触发器
❖ 【例7-4】创建一种行级旳DELETE触发器。 CREATE OR REPLACE TRIGGER tg_delete AFTER DELETE ON departments FOR EACH ROW BEGIN DBMS_OUTPUT.PUT_LINE (‘您执行了删除操作…’); END tg_delete;
❖ SQL> INSERT INTO departments VALUES(220,‘edu’,103,2500);
11
7.2.2 语句级触发器
❖ 【例7-2】创建一种 BEFORE型语句级触发器。禁止周六、周 日对employees表进行DML操作,假如在周六、周日对 employees表进行了任何操作,则中断操作,并提醒顾客不允 许在此时间对employees表进行操作。
SQL Server实用教程(SQL Server 版)
读书笔记模板
01 思维导图
03 目录分析 05 精彩摘录
目录
02 内容摘要 04 读书笔记 06 作者介绍
思维导图
本书关键字分析思维导图
教学
实验
数据库
实验
数据库
创建
设计
版
应用
综合 习题
实习
实用教程
管理
过程
系统
器
数据
应用
内容摘要
本书是普通高等教育“十一五”国家级规划教材,分为实用教程、实验和综合应用实习三部分。本书以 MicrosoftSQLServer2008中文版为教学和开发平台,先介绍数据库的基本概念、数据库创建、表与表数据操作、 数据库的查询和视图、T-SQL语言、索引与数据完整性、存储过程和触发器、备份与恢复、系统安全管理、 SQLServer2008与XML等数据库基础知识,然后是实验和综合应用实习题目。本书免费提供教学课件和配套的客户 端/SQLServer2008应用系统数据库和源程序文件。
P0.1数据库 P0.2基本表 P0.3视图 P0.4完整性约束 P0.5存储过程 P0.6触发器 P0.7系统功能 P0.8 B/S方式界面的设计
P1.1创建图书管理站 P1.2设计母版页 P1.3设计“读者管理”页面 P1.4设计“借书”页面
P2.1创建图书管理系统 P2.2设计父窗体 P2.3设计读者管理窗体 P2.4设计借书窗体
目录分析
第2章数据库创建
第1章数据库的基 本概念
第3章表与表数据 操作
1
第4章数据库的 查询和视图
2
第5章 T-SQL 语言
3
第6章索引与数 据完整性
第07章存储过程和触发器
山东工商学院
陈章良
7.1.2 用户存储过程的创建与执行
(2)存储过程的执行 语 法 格 式
[ EXEC [ UTE ] ] { [ @return_status = ] { procedure_name [ ;number ] | @procedure_name_var } [ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] } [ ,...n ] [ WITH RECOMPILE ] }
山东工商学院
陈章良
7.1.4 用户存储过程的删除
语法格式
DROP PROCEDURE { procedure } [ ,...n ]
【例7.10】删除 PXSCJ数据库中的student_info1 存储过程。 USE PXSCJ GO DROP PROCEDURE student_info1
山东工商学院
CREATE PROCEDURE student_info AS SELECT a.xh,xm,kcm,cj,xf FROM XSB a JOIN CJB b ON a.xh=b.xh JOIN KCB t ON b.kch= t.kch GO
山东工商学院
陈章良
7.1.2 用户存储过程的创建与执行
3) 使用带OUTPUT参数的存储过程
山东工商学院
陈章良
7.1.2 用户存储过程的创建与执行
(3)举例 1) 设计简单的存储过程
【例7.1】从XSCJ USE PXSCJ 数据库的三个表中查 /*检查是否已存在同名的存储过程,若有,删除*/ 询,返回学生学号、 IF EXISTS (SELECT name FROM sysobjects WHERE name = 'student_info' AND type='P') 姓名、课程名、成绩、 DROP PROCEDURE student_info 学分。该存储过程不 GO 使用任何参数。 /*创建存储过程*/
《数据库基础与应用》课程标准
《数据库基础与应用》课程标准适用专业:计算机应用层次: ________________ 史专________________ 授课形式:____________ 全日制 ________________ 课程性质:专业必修课学时数: ________________ 64 ______________《数据库基础与应用》课程标准一、适用对象适用于全日制中专计算机应用专业学生二、课程性质与定位《数据库基础与应用》课程是计算机应用专业的一门专业必修课。
数据库系统已成为计算机科学教育中必不可少的部分,因而,牢固地掌握数据库系统知识已成为我们日常学习的核心内容。
信息时代的计算机应用人才,应当熟练掌握计算机科学技术中的数据库技术,并能够根据实际需求应用数据库系统进行数据信息管理。
数据库是数据管理的最新技术,是计算机学科的重要组成部分。
数据库技术发展迅速,其应用早已超出计算机专业的范畴,各专业领域的人们都在学习和使用数据库。
根据数据库的发展情况,本书摒弃了以往教材中不可缺少的网状数据库和层次数据库两大内容,以关系型数据库管理系统作为实例。
三、课程教学目标通过本课程的理论学习和上机实验,使学生了解现在数据库的流行趋势和先进的知识;初步掌握数据库管理系统的基本原理,数据库的基本设计方法;掌握一种流行数据库系统的基本操作方法和编程技术;重点培养学生数据库应用系统软件开发的技术和能力。
四、本课程学时安排五、课程教学内容和基本要求(按章节详细阐述)第一章:数据库概述(一)教学重点和难点1.教学重点:数据库和数据模型的基本概念数据模型的三要素概念模型的表示方法数据库技术的发展过程与研究领域数据库系统的模式结构与体系结构DBMS的功能与组成2.教学难点:数据库和数据模型的有关概念、数据库技术的发展与研究领域以及数据库系统的结构。
(二)教学内容和基本要求1.教学内容:1.1引言1.1.1数据、数据库、数据库系统和数据库管理系统的基本概念1.1.2数据管理的进展1.1.3数据库技术的研究领域1.2数据模型1.2.1数据模型的三要素1.2.2概念模型1.2.3三种主要的数据模型1.3数据库系统的结构1.3.1数据库系统的模式结构1.3.2数据库系统的体系结构1.3.3数据库管理系统2.教学目的及要求:本章主要讲述了数据库的有关概念,通过本章的学习,读者应该理解数据库的基本概念、数据库的三级模式结构和二级映像功能;知道数据模型的三要素,会画E-R图。
实验七 存储过程与触发器
实验七存储过程与触发器实验七存储过程与触发器一、创建一个名为“proc_1”的存储过程,用于查看学生表的所有信息。
然后调用该存储过程。
二、创建一个名为“proc_2”的存储过程,用于向学生表的所有字段添加一条记录,记录内容由调用时决定。
然后调用该存储过程。
三、创建一个名为“proc_3”的存储过程,用于删除学生表中指定学号的记录,具体学号由调用时决定。
然后调用该存储过程。
四、修改存储过程“proc_3”,用于查询不小于指定成绩的学生的基本信息,具体成绩由调用时决定。
五、选做题:创建一个名为“proc_4”的存储过程,用于求一个3位整数的反序数。
例如123的反序数为321。
create proc proc_4 @a int asdeclare @b int,@c int,@t int,@s int beginset @t=@a % 10select @b=@a/10,@b=@b % 10 set @c=@a/100set @s=@t*100+@b*10+@c select @s end goexec proc_4 123六、创建一个名为“trig_1”的触发器,当向学生表添加记录时,该触发器自动显示学生表的所有信息。
七、修改名为“trig_1”触发器,当试图向学生表添加、修改或删除记录时,该触发器自动显示如下信息:“对不起,你无权进行更新操作!”。
八、修改“trig_1”的触发器,当向学生表修改记录时,该触发器自动显示修改前(deleted)和修改后(inserted)的记录。
九、选做题:创建一个名为“trig_4”的触发器,当向成绩表添加记录时,该触发器自动显示与该记录相关的学生的学号、姓名和班级。
(本题要求创建之前先判断该触发器是否存在) if exists(select name from sysobjects where name=' trig_4' and type='TR') drop trigger trig_4 gocreate trigger trig_4 on 成绩表 for insert asselect 学号,姓名,班级from 学生表where 学号 in (select 学号 from inserted) goinsert 成绩表values(“0012”,“02”,80)2、截取图片,填写如下实验过程记录表实验过程记录(注意:标注题号) 1.2.3.4.。
触发器与存储过程
触发器与存储过程触发器(Trigger)是数据库中的一种特殊对象,它与一些特定的数据库事件相关联,并且当这个事件发生时,触发器可以在自动执行的过程中被触发。
而存储过程(Stored Procedure)则是一段预先编译好的SQL 语句的集合,它可以被保存在数据库服务器端,通过调用来执行。
触发器和存储过程都是数据库中的重要组件,它们都可以用于实现数据的自动化处理和一些复杂的业务逻辑。
但是它们在功能和使用方法上有一些不同之处。
首先,触发器的触发条件是事先设置好的,当该条件满足时才会被触发执行,而存储过程是主动调用执行的。
触发器通常与数据库中的表相关联,并且在表上的插入、更新或删除等事件发生时触发。
存储过程可以在任何时候被调用执行,无论是否有其他数据库事件发生。
其次,触发器通常用于实现数据的自动化处理,比如在插入新纪录时通过触发器自动计算一些字段的值,或者在删除记录时触发器做一些相关操作。
而存储过程则更倾向于实现业务逻辑的封装和复用,比如在一个库存管理系统中,可以使用存储过程来实现添加商品、修改商品信息、删除商品等操作。
此外,触发器由数据库引擎直接管理,它是与数据库表密切相关的一种对象,所以当表被删除或者修改时,相关联的触发器也会相应地被删除或修改。
而存储过程则是作为独立于表的对象存在,当数据库表被删除或修改时,存储过程不受影响。
在使用上,触发器和存储过程都可以用于实现一些相同的功能,但触发器更适合于在特定的数据库事件发生时执行自动化的操作,而存储过程更适合于实现复杂的业务逻辑和一些需要主动调用的场景。
总之,触发器和存储过程都是数据库中的重要组件,它们可以用于实现一些自动化的处理和复杂的业务逻辑。
它们在功能和使用方法上有一些不同之处,需要根据具体的需求来选择和使用。
触发器和存储过程
DBMS
OS
DB
由于要设计自己的多任务处理机制和调度算法, 使得N+1方案的DBMS设计在整体上比2N方案要复杂。
Server要处理所有用户的申请,如果调度策略不当或
不能使数据库进程获得较高的优先权,这种方案将导 致瓶颈。 另外,N+1方案中要用到操作系统级的消息机制 以实现多进程向单进程以及单进程向多进程的数据传
针对强制关联关系, 建立触发器。
注意引用完整性
数据录入、修改
数据查询、报表
View
存储过程
T_student
T_teacher
T_Course
T_grade
触发器
三、 DBMS的基本功能和系统结构
1、DBMS的基本功能
◆ 数据库定义
对数据库的结构进行描述,包括外模式、模式、 内模式的定义;数据库完整性的定义;安全保密定义 (如用户口令、级别、存取权限);存取路径 (如索引)
2、设计有效索引 注 意:如果一项查询中,需访问表中多于20%的行, 则使用表扫描比使用索引效率高。 使用索引的指导方针:
● 适量使用索引 ● 不要索引较小的表(比如只有几百行) ● 尽可能使用较少的索引键列
● 尽可能使用覆盖查询(即查询内容包含于索引列
中,则只有索引被访问,表本身被“绕”过)
数据库设计中需要深入考虑的问题
的结果。
存储过程潜在的缺点如下:
1、难以保持负荷平衡。
存储过程提出了一种在服务器上集中处理的模型,
用集中处理代替事务的分布处理。这种方法,除非服 务器的性能进行了优化,符合存储过程运行的需求, 否则它会降低服务器的性能。 2、增加了管理要求。
存储过程是一个共享的资源。管理员必须确保使
存储过程与触发器 实验报告
信息工程学院实验报告课程名称:《数据库原理》实验项目名称:存储过程与触发器一、实验目的:(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表中查询此学生的信息。
存储过程与触发器实验报告
存储过程与触发器实验报告本实验旨在探究存储过程与触发器的概念、作用、使用范围和创建过程,并且通过编写相关的示例代码来展示它们的实际应用。
一、实验原理1. 存储过程存储过程是一组预定义好的 SQL 语句,可以重复使用并且可以直接被调用。
它类似于程序中的函数,可以接受参数、返回值、流程控制等。
2. 触发器触发器是与数据库表相关的事件响应机制,可以在数据库表上定义一些触发条件,当满足这些条件时就会触发执行一些操作,比如插入、更新或删除数据。
二、实验步骤1. 存储过程的创建与使用(1)创建一个用于统计某个用户的订单数量的存储过程。
```DELIMITER //CREATE PROCEDURE `getOrderCount`(IN p_userid INT, OUTp_count INT)BEGINSELECT COUNT(*) INTO p_count FROM orders WHERE user_id = p_userid;END//DELIMITER ;```(2)调用这个存储过程,并输出结果。
```CALL getOrderCount(123, @count);SELECT @count AS 'order_count';```2. 触发器的创建与使用(1)创建一个在用户表中插入新记录时自动生成一个账户记录的触发器。
```DELIMITER //CREATE TRIGGER `insert_user_account` AFTER INSERT ON `users` FOR EACH ROWBEGININSERT INTO accounts (user_id, balance) VALUES (NEW.id, 0);END//DELIMITER ;```(2)在用户表中插入一条新记录,触发器会自动执行并在账户表中生成一条新记录。
```INSERT INTO users (name, email) VALUES ('Alice','***************');SELECT * FROM accounts WHERE user_id =LAST_INSERT_ID();```三、实验结论通过实验我们发现,存储过程可以将一些常用的 SQL 语句封装为一个可以重复调用的函数,使得程序更加简洁和高效。
实验7-存储过程和触发器的使用
实验7 存储过程和触发器的使用1.存储过程①创建存储过程,使用Employees表中的员工人数来初始化一个局部变量,并调用这个存储过程USE YGGLGOCREATE PROCEDURE TEST@NU MBER int OUTPUTASBEGINDECLARE@NU MBER2inTSET@NU MBER2=(SELECT COUNT(*)FROM Employees)SET@NU MBER1=@NU MBER2END②创建存储过程,比较两个员工的实际收入,若前者比后者高就输出0,否则输出1 BEGINDECLARE@SR1float,@SR2FLOATSELECT@SR1=InCome-OutCome FROM Salary WHERE EmployeeID=@ID1SELECT@SR2=InCome-OutCome FROM Salary WHERE EmployeeID=@ID2IF@ID1>@ID2SET@BJ=0ELSESET@BJ=1END③创建添加职员记录的存储过程EmployeeAddUSE YGGLGOCREATE PROCEDURE EmployeeAdd(@employeeid char(6),@name char(10),@education char(4),@birthday datetime, @woekyear tinyint,@sex bit,@address char(40),@phonenumber char(12),@departmentID char(3))ASBEGININSERT INTO EmployeesVALUES(@employeeid,@name,@education,@birthday,@woekyear,@sex,@address,@phonenumber,@departmentID)ENDRETURNGO④创建带有OUTPUT游标参数的存储过程,在Employees表中声明并打开游标USE YGGLGOCREATE PROCEDURE em_cursor@em_cursor cursor VARYING OUTPUTASBEGINSET@em_cursor=CURSOR FORWARD_ONLY STATICFORSELECT*FROM EmployeesOPEN@em_cursorENDGO⑤创建存储过程,使用游标确定一个员工的实际收入是否排在前三名,结果为1表示是,结果为0表示否REATE PROCEDURE TOP_THREE@EM_ID char(6),@OK bit OUTPUTASBEGINDECLARE@X_EM_ID char(6)DECLARE@ACT_IN int,@SEQ intDECLARE SALARY_DIS cursor FORSELECT EmployeeID,InCome_OutComeFROM SalaryORDER BY InCome_OutCome DESCSET@SEQ=0SET@OK=0OPEN SALARY_DISFETCH SALARY_DIS INTO@X_EM_ID,@ACT_INWHILE@SEQ<3 AND@OK=0BEGINSET@SEQ=@SEQ+1IF@X_EM_ID=@EM_IDSET@OK=1FETCH SALARY_DIS INTO@X_EM_ID,@ACT_INENDCLOSE SALARY_DISDEALLOCATE SALARY_DISEND2.触发器①向Employees表插入或修改一个记录时,通过触发器检查记录的DpartmentID值在Dpartments表中是否存在,若不存在,则取消插入或修改操作USE YGGLGOCREATE TRIGGER EmployeesIns ONFOR INSERT,UPDATEASBEGINIF((SELECT DepartmentID from inserted)NOT IN(SELECT DepartmentID FROM DepartmentS))ROLLBACKEND②修改Dpartments表“DpartmentID”字段值时,该字段在Employees表中对应的值也做相应修改USE YGGLUSE YGGLGOCREATE TRIGGER DepartmentUpdate ONFOR UPDATEASBEGINUPDATE EmployeesSET DepartmentID=(SELECT DepartmentID FROM insered)WHERE DepartmentID=(SELECT DepartmentID FROM deleted)ENDGO③删除Dpartment表中记录的同时删除该记录“DpartmentID”字段值在Employees表中对应的记录CREATE TRIGGER DepartmentsDelate ONFOR DELETEASBEGINDELETE FROM EmployeesWHERE DepartmentID=(SELECT DepartmentID FROM deleted)ENDGO④创建INSTEAD OF 触发器,当向Salary表中插入记录时,先检查EmployeeID列上的值在Employees中是否存在,如果在则执行插入操作,如果不存在,则提示“员工号不存在”CREATE TRIGGER EM_EXISTS ON SalaryINSTEAD OF INSERTASBEGINDECLARE@EmployeeID char(6)SELECT@EmployeeID=EmployeeIDFROM insertedIF(@EmployeeID IN(SELECT EmployeeID FROM Employee))INSERT INTO Salary SELECT*FROM insertedELSEPRINT'员工号不存在'END⑤创建DDL触发器,当删除YGGLXJ数据库的一个表时,提示“不能删除表”,并回滚删除表的操作USE YGGLGOCREATE TRIGGER table_deleteON DATABASEAFTER DROP_TABLEASPRINT'不能删除该表'ROLLBACK TRANSACTION。
实验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 利用管理平台 2 利用T-sql语句 ALTER PROC [ EDURE ] procedure_name [ ; number ] [ { @parameter data_type } [ VARYING ] [ = default ] [ OUTPUT ] ] [ ,...n ] [ WITH { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ] [ FOR REPLICATION ] AS sql_statement [ ...n ] 示例:为proc_stu1 加密 还能查看吗?????
概述
一、触发器概念 触发器是一种特殊类型的存储过程,存储过程是通过存储 过程名被调用执行的,而触发器不由用户直接调用,主要 是通过事件触发而被执行的,而且可以包含复杂的 SQL 语句。 1)它与表紧密相连,可以看作表定义的一部分; 2)它不能通过名称被直接调用,更不允许带参数,而 是当用户对表中的数据进行修改时,自动执行; 3)它可以用于SQL Server约束、默认值和规则的完整 性检查,实施更为复杂的数据完整性约束。
常用的扩展存储过程:xp_cmdshell
– 可以执行DOS命令下的一些的操作 – 以文本行方式返回任何输出 – 调用语法: – EXEC xp_cmdshell DOS命令 [,NO_OUTPUT] xp_cmdshell 'md d:\aa'
创建存储过程
在SQL Server中,可以使用两种方法创建存储过程 : 1. 利用SQL Server 管理平台创建存储过程。 2. 使用Transact-SQL语句中的CREATE PROCEDURE命令 创建存储过程。 创建存储过程时,需要确定存储过程的几个组成部分: ①所有的输入参数以及传给调用者的输出参数。 ②被执行的针对数据库的操作语句,包括调用其它存储过程 的语句。 ③返回给调用者的状态值,以指明调用是成功还是失败。 ④捕获和处理潜在的错误所需的任何错误处理语句
数据库实验5 存储过程和触发器
实验五存储过程和触发器一、实验目的(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语句可永久地删除存储过程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
EXECUTE procGetStudentByName '王冲瑞' --返回王冲瑞同学的信息
【例7.3】
CREATE PROCEDURE procGetAvgGradeByNum
@Sno char(7), @avgGrade SMALLINT OUTPUT
AS
SELECT @avgGrade =AVG(Grade)
【例7.9】
ENABLE Trigger ALL ON ALL SERVER;
【例7.10】
ALTER TABLE SC DISABLE TRIGGER triSCInsert
4.删除触发器
【例7.11】 删除 DML 触发器。删除 SC表中的triSCInsert触发器。
(5)sp_stored_procedures 'procGetStudent'
--删除存储过程
EXEC sp_depends procGetStudent --查看procGetStudent所依赖的对象
DROP PROCEDURE procGetStudent --删除存储过程procGetStudent
AS
SELECT *
FROM Students
WHERE Sname LIKE RTRIM(@name);
--执行的方法:
EXECUTE procGetStudentByName; --返回所有学生的信息
或
EXECUTE procGetStudentByName '吴%'; --返回所有姓吴的学生信息
FROM SC
WHERE Sno=@Sno;
--执行存储过程,得到该学生的平均成绩。
DECLARE @averageGrade SMALLINT
EXEC procGetAvgGradeByNum '0602001', @averageGrade OUTPUT
PRINT '0602001的平均成绩为'+ STR(@averageGrade)
--在SQL Server Management Studio中创建DML触发器
CREATE TRIGGER triSCInsert --定义触发器所附着的表的名称“SC”
ON SC --定义触发器的类型
FOR INSERT --定义触发器的类型
--使用系统存储过程来查看用户创建的存储过程
(1) EXEC sp_help procGetStudent
(2) EXEC sp_helptext procGetStudent
(3)EXEC sp_depends procGetStudent
(4)Select * from sysobjects where name='procGetStudent' and type='p'
FROM Students
WHERE Sno=@number
--调用存储过程
EXECUTE procGetStudent '0602001';
【例7.1】
--创建存储过程的T-SQL语句如下:
USE StudentCourse
Go
CREATE PROC procAddCourse
END
--修改数据验证触发器
UPDATE SC SET Grade=80
WHERE Sno='06001' AND Cno='c1'
【例7.4】
CREATE TRIGGER triStudentDelete --定义名称为triStudentDelete的触发器
FOR UPDATE --定义触发器的类型
AS
IF UPDATE (Grade) --对分数列的更改
BEGIN
RAISERROR('不能修改课程分数',16,10)
ROLLBACK TRANSACTION
@Cno CHAR(3),@Cname VARCHAR(20),@PreCno CHAR(3),@Credit TINYINT
AS
INSERT INTO
Courses(Cno,Cname, PreCno, Credit)
VALUES (@Cno,@Cname, @PreCno, @Credit)
IF OBJECT_ID ('triSCInsert', 'TR') IS NOT NULL
DROP TRIGGER triSCInsert
【例7.12】
IF EXISTS ( SELECT *
FROM sys.triggers
WHERE parent_class = 0 AND name = 'safetyDB')
【例7.5】
CREATE TRIGGER safetyDB
ON DATABASE
FOR DROP_TABLE,ALTER_TABLE
AS
PRINT '禁止删除或修改数据库库中的表'
ROLLBACK;
--可以使用系统存储过程查看DML触发器。
(1)sp_help 'triStudentDelete'
AS
BEGIN
DECLARE @Sno char(7)
SELECT @Sno=ห้องสมุดไป่ตู้nserted.Sno FROM inserted
IF NOT EXISTS (SELECT Sno FROM Students WHERE Sno=@Sno)
PRINT '学生表中没有该学号的同学!'
ROLLBACK TRANSACTION
END
--插入数据验证触发器
Insert Into SC Values('0703005','C1',84)
--删除SC表中学号Sno参照外键FK_SNO
ALTER TABLE SC
DROP TRIGGER safetyDB ON DATABASE
ON Students --定义触发器所附着的表的名称Students
FOR DELETE --定义触发器的类型
AS
BEGIN
DECLARE @Sno CHAR(7)
AS
Select * FROM Courses
GO
--调用存储过程
EXECUTE procGetAllCourses;
(2)
--用T-SQL命令窗口创建存储过程
CREATE PROCEDURE procGetStudent
@number char(7)
AS
SELECT *
AS --下面是触发条件和触发器执行时要进行的操作
BEGIN
DECLARE @Sno char(7)
SELECT @Sno=inserted.Sno FROM inserted
IF NOT EXISTS (SELECT Sno FROM Students WHERE Sno=@Sno)
DROP CONSTRAINT FK_SNO
--用T-SQL命令窗口创建DML触发器
CREATE TRIGGER triSCUpdate --定义名称为triSCUpdate的触发器
ON SC --定义触发器所附着的表的名称“SC”
--执行存储过程的T-SQL语句如下:
EXEC procAddCourse
@Cno='C5', @Cname='C#程序设计', @PreCno='C2', @Credit=4
或
EXEC procAddCourse 'C5', 'C#程序设计', 'C2', 4
【例7.2】
CREATE PROCEDURE procGetStudentByName @name char(8)='%'
【例7.7】
DISABLE TRIGGER triSCInsert ON SC
GO
ENABLE TRIGGER triSCInsert ON SC
【例7.8】
DISABLE TRIGGER safetyDB ON DATABASE;
GO
ENABLE TRIGGER safetyDB ON DATABASE;
PRINT '学生表中没有该学号的同学!'
ELSE
INSERT INTO SC SELECT * FROM inserted --如果满足条件则插入数据
END
--插入语句测试触发器的动作
INSERT INTO SC VALUES('0701008','C1',84)
(2)sp_helptext 'triStudentDelete'
(3)sp_depends 'triStudentDelete'
sp_depends 'SC'
【例7.6】
ALTER TRIGGER triSCInsert
ON SC
INSTEAD OF INSERT
SELECT @Sno=deleted.Sno FROM deleted
DELETE SC WHERE Sno=@Sno
END