SQL存储过程和触发器

合集下载

MySQL中的触发器和存储过程的区别与用途

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的触发器,它在订单表插入数据后触发,然后执行更新库存表的操作。

存储过程和触发器实验心得

存储过程和触发器实验心得

存储过程和触发器实验心得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开始,导致违反唯一约束条件,从而导致调用储存过程失败。

四、实验心得体会通过本次实验,学会了储存过程以及触发器和序列的使用方法,对存储过程有了一个直观的认识,对触发器的工作原理和作用有了更加深刻的认识,使用触发器可以在修改数据前后规范数据,使数据规范化和标准化。

存储过程和触发器(数据库实验5)

存储过程和触发器(数据库实验5)

数据库基础与实践实验报告实验五存储过程和触发器班级:惠普测试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='无此专业。

数据库中触发器与存储过程的性能对比研究与最佳实践

数据库中触发器与存储过程的性能对比研究与最佳实践

数据库中触发器与存储过程的性能对比研究与最佳实践触发器(Trigger)和存储过程(Stored Procedure)是数据库中常用的两种编程对象,它们在处理数据库操作和逻辑时扮演着重要的角色。

然而,对于开发人员来说,在选择和使用触发器和存储过程时需要考虑性能方面的因素。

本文将对数据库中触发器和存储过程的性能进行详细的对比研究,并提供最佳实践建议。

首先,我们来了解触发器和存储过程的基本概念和作用。

触发器是一种被动的数据库对象,它在特定的操作(如插入、更新或删除)发生时自动执行特定的SQL语句。

触发器常用于实现数据一致性和完整性约束、日志记录等功能。

而存储过程则是一组预定义的SQL语句集合,它可以被重复调用以完成特定的任务。

存储过程通常用于集中管理和处理复杂的业务逻辑和数据操作。

性能方面,触发器和存储过程在执行速度和资源使用方面有所差异。

触发器在数据操作时会自动触发执行,因此会增加数据库操作的时间开销。

而存储过程则需要显式地调用才能执行,因此可以更加灵活地控制和优化执行顺序和方式。

另外,触发器的执行是针对每一条数据操作的,而存储过程的执行是针对整个过程的。

这就意味着当需要处理大量数据时,触发器的性能可能会受到限制。

在设计和使用触发器时,以下几点是可以优化性能的最佳实践。

首先,尽量避免在触发器中执行复杂的查询操作,因为触发器的执行会在数据操作的上下文中执行,且触发器是同步执行的。

如果在触发器中执行复杂查询,会增加数据操作的执行时间。

其次,如果触发器的逻辑可以通过其他方式实现,如应用程序代码或存储过程,就尽量避免使用触发器。

这是因为触发器会增加数据库系统的负担和开销,尤其当同时存在多个触发器时。

在设计和使用存储过程时,以下几点是可以优化性能的最佳实践。

首先,减少存储过程的执行时间。

可以通过优化SQL语句、使用适当的索引、避免使用循环等方式来减少存储过程的执行时间。

其次,合理使用参数和返回值。

通过使用参数和返回值规范输入输出,可以提高存储过程的执行效率和可维护性。

实验五:触发器和存储过程

实验五:触发器和存储过程

实验五:触发器和存储过程一.实验目的:理解触发器和存储过程的含义,掌握用SQL语句实现触发器和存储过程的编写,并初步掌握什么情况下使用事务。

二.实验内容:有一个小型的图书管理数据库,包含的表为:bookstore(bookid,bookname,bookauthor,purchasedate,state);--图书库存表borrowcard(cardid,ownername);--借书证表borrowlog(cardid,bookid,borrowdate,returndate);--借书记录表写一个存储过程,实现借书操作,要求有事务处理。

(1)读者借书,要先设置书籍不在库标志state(借出),然后增加借书记录,在同一事务中完成。

(2)要求在事务执行过程中引入错误触发事件,以此体会事务的错误保护机制和事务编程的作用。

(3)要求用触发器实现表的完整性控制。

三、操作与运行1.创建图书数据库:create table bookstore(bookid int not null primary key,bookname char(20),bookauthor char(20),purchasedate datetime,state char(4))create table borrowcard(cardid int not null primary key,ownername char(20))create table borrowlog(cardid int not null,bookid int not null,borrowdate datetime,returndate datetime,primary key(cardid,bookid),---foreign key(cardid)references borrowcard(cardid), ---foreign key(bookid)references bookstore(bookid) )通过以上语句,可以看到数据库中的表建立成功。

存储过程与触发器

存储过程与触发器

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所示。

SQL Server 2005数据库原理及应用教程第8章 存储过程和触发器

SQL Server 2005数据库原理及应用教程第8章 存储过程和触发器

2.相关注意事项 ①不能将 CREATE PROCEDURE语句与其他 SQL 语句组合 PROCEDURE语句与其他 到单个批处理中。 ②创建存储过程的权限默认属于数据库所有者,该所有者可将 此权限授予其他用户。 ③存储过程是数据库对象,名称必须遵守标识符规则。 ④只能在当前数据库中创建存储过程。 ⑤一个存储过程的最大尺寸为128M。 ⑤一个存储过程的最大尺寸为128M。 ⑥可以在存储过程内引用临时表。 ⑦如果执行的存储过程调用另一个存储过程,则被调的存储过 程可以访问由第一个存储过程创建的包括临时表在内的所有 对象。 ⑧存储过程中参数的最大数量为2100。 ⑧存储过程中参数的最大数量为2100。 ⑨不要以sp_为前缀创建任何存储过程。 ⑨不要以sp_为前缀创建任何存储过程。
1.语法格式 创建存储过程的语法格式: CREATE PROC[EDURE] procedure_name[;number] [{@parameterdata_type} [VARYING][=default][OUTPUT] ][,...n] WITH AS sql_statement [ ...n ] ①procedure_name:用于指定要创建的存储过程的名称。 procedure_name:用于指定要创建的存储过程的名称。 ②number:该参数是可选的整数,它用来对同名的存储过程分组,以便用 number:该参数是可选的整数,它用来对同名的存储过程分组,以便用 一条 DROP PROCEDURE 语句即可将同组的过程一起除去。 ③@parameter:过程中的参数,在 CREATE PROCEDURE 语句中可以 @parameter:过程中的参数,在 声明一个或多个参数。 ④data_type:用于指定参数的数据类型。 data_type:用于指定参数的数据类型。 ⑤VARYING:用于指定作为输出OUTPUT参数支持的结果集。 VARYING:用于指定作为输出OUTPUT参数支持的结果集。 ⑥DEFAULT:用于指定参数的默认值。 DEFAULT:用于指定参数的默认值。 ⑦OUTPUT:表明该参数是一个返回参数。 OUTPUT:表明该参数是一个返回参数。 ⑧AS:用于指定该存储过程要执行的操作。 AS:用于指定该存储过程要执行的操作。 ⑨sql_statement:是存储过程中要包含的任意数目和类型的 Transactsql_statement:是存储过程中要包含的任意数目和类型的 TransactSQL 语句。

触发器、存储过程和函数三者有何区别 四

触发器、存储过程和函数三者有何区别 四

触发器、存储过程和函数三者有何区别四什么时候用存储过程?存储过程就是程序,它是经过语法检查和编译的SQL语句,所以运行特别快。

触发器是特殊的存储过程,存储过程需要程序调用,而触发器会自动执行;你所说的函数是自定义函数吧,函数是根据输入产生输出,自定义只不过输入输出的关系由用户来定义。

在什么时候用触发器?要求系统根据某些操作自动完成相关任务,比如,根据买掉的产品的输入数量自动扣除该产品的库存量。

什么时候用存储过程?存储过程就是程序,它是经过语法检查和编译的SQL语句,所以运行特别快。

存储过程和用户自定义函数具体的区别先看定义:存储过程存储过程可以使得对数据库的管理、以及显示关于数据库及其用户信息的工作容易得多。

存储过程是SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。

存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。

存储过程可包含程序流、逻辑以及对数据库的查询。

它们可以接受参数、输出参数、返回单个或多个结果集以及返回值。

可以出于任何使用SQL 语句的目的来使用存储过程,它具有以下优点:·可以在单个存储过程中执行一系列SQL 语句。

·可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。

·存储过程在创建时即在服务器上进行编译,所以执行起来比单个SQL 语句快。

用户定义函数函数是由一个或多个Transact-SQL 语句组成的子程序,可用于封装代码以便重新使用。

Microsoft? SQL Server? 2000 并不将用户限制在定义为Transact-SQL 语言一部分的内置函数上,而是允许用户创建自己的用户定义函数。

可使用CREATE FUNCTION 语句创建、使用ALTER FUNCTION 语句修改、以及使用DROP FUNCTION 语句除去用户定义函数。

每个完全合法的用户定义函数名(database_name.owner_name.function_name) 必须唯一。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

或者查询分析器中点开相应的存储过程,右击打 开,通过图形界面去执行和编辑(修改)
存储过程的执行格式3
如果该过程是批处理(可执行文件)中的第一条 语句,则可使用:
不需书写EXEC命令
au_info 'Dull', 'Ann' -- Or au_info @lastname = 'Dull', @firstname = 'Ann' -- Or au_info @firstname = 'Ann', @lastname = 'Dull'
触发器
5.6.1 创建触发器 5.6.2 查看、修改和删除触发器
1. 使用企业管理器创建触发器
其操作步骤如下 1、启动Enterprise Manger 登录到指定的服务器 上
2、展开数据库然后展开要在其上创建触发器的表 所在的数据库然后单击该表 3、右击鼠标在弹出菜单中选择ALL Tasks, 然后 单击Manage Triggers… 4、在名字框中选择new 在文本框中输入触发器 文本5、单击Check Syntax 检查语句是否正确 6、单击Apply 在Name 下拉列表中会有新创建的 触发器名字 7、单击OK 关闭窗口创建成功
表示过了还书期限 表示还没有还书
举例
update 借阅信息表
set
还书日期 = getdate( )
where 图书证号 =10004 and 书籍ID=22
获取系统当前日期和时间,在查询分析器中 使用select
getdate()命令(不带参数)
5.6.2 查看、修改和删除触发器
1. 查看触发器 (1)使用企业管理器和查询分析器查 看触发器信息 (2)使用系统存储过程查看触发器
存储过程的执行格式2
-- Or EXEC au_info 'Dull', 'Ann' -- Or EXEC au_info @lastname = 'Dull', @firstname = 'Ann' -- Or EXEC au_info @firstname = 'Ann', @lastname = 'Dull„
5.6 触发器
触发器概念及作用 触发器是一种特殊类型的存储过程。
两者的区别是:触发器主要是通过事件进行触 发而被执行,而存储过程可以通过存储过程名称 而被直接调用。
触发器的主要作用是它能够实现由主键和外键 所不能保证的复杂的参照完整性和数据的一致性。
触发器主要优点如下:
触发器是自动的:当对表中的数据作了任 何修改(比如手工输入或者应用程序采取的 操作)之后立即被激活。 触发器可以通过数据库中的相关表进行层 叠更改。 触发器可以强制限制,这些限制比用 CHECK 约束所定义的更复杂,功能更强大。
(1)用右键单击要创建存储过程的数据库, 在弹出的菜单中选择“新建”——“存储过程…” 选项;或者用右键单击存储过程图标,从弹出 的菜单中选择“新建存储过程…”选项。会出现 创建存储过程对话框,如图1所示。 (2)在文本框中可以输入创建存储过程的 T_SQL语句,单击“检查语法”,则可以检查 语法是否正确;单击“确定”按钮,即可保存 该存储过程。如果要设置权限,单击“权限…” 按钮,如图2所示。
{(FOR|AFTER|INSTEADOF){[INSERT][,]UPDAT E}} [NOTFORREPLICATION] AS {IFUPDATE(column) [{AND|OR}UPDATE(column)] [...n] | IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask ) {comparison_operator}column_bitmask[.. .n] } sql_statement[...n] } }
存储过程的执行格式1
au_info 存储过程可以通过以下方法执行:
EXECUTE au_info 'Dull', 'Ann' -- Or EXECUTE au_info @lastname = 'Dull', @firstname = 'Ann' -- Or EXECUTE au_info @firstname = 'Ann', @lastname = 'Dull'
(2)使用系统存储过程查看触发器
• sp_help:用于查看触发器的一般信息,如 触发器的名称、属性、类型和创建时间。 sp_help ‘触发器名称’ • sp_helptext:用于查看触发器的正文信息 sp_helptext ‘触发器名称’ • sp_depends:用于查看指定触发器所引用 的表或者指定的表涉及到的所有触发器。 sp_depends ’触发器名称’ sp_depends ‘表名’
举例
Create TRIGGER borrow_infor ON 借阅信息表 FOR INSERT, UPDATE, DELETE AS select * from 借阅信息表 where 还书日期 is null
举例
在借阅信息表上创建一个更新类型的触发器, 显示罚款清单:
Create TRIGGER reminder ON 借阅信息表 FOR UPDATE 表示在对表的内容 更新时被触发 AS select 图书证号,书籍ID,((cast(还书日期 as int)-cast(应还日期 as int))*0.2) as 罚款元 from 借阅信息表 where (还书日期 is not null) and 显示罚款金额 (还书日期>应还日期) GO
图1 新建存储过程对话框
图2 设置权限对话框
2. 举例
返回所有学生信息 Use pubs go create procedure test_liuxg0 as Select * From publishers go
2. 举例:带参数的存储过程
Use pubs go create procedure test_liuxg1 @name_liu varchar(20) as select * From publishers where pub_name=@name Go 执行: Exec student_infor @name=‘GGG&G’
2. 修ห้องสมุดไป่ตู้触发器
(1)使用企业管理器修改触发器正文 在企业管理器中,展开指定的服务器和数据 库,选择指定的数据库和表,用右键单击要修改 的表,从弹出的快捷菜单中选择所有任务子菜单 下的管理触发器选项,则会出现触发器属性对话 框。在名称选项框中选选择要修改的触发器的名 称,然后在文本框中修改触发器的SQL语句,单 击“检查语法”按钮,可以检查语法是否正确。
存储过程的概念
在SQL Server 的系列版本中存储过程分为两类: 系统提供的存储过程和用户自定义存储过程。 • 系统过程主要存储在master 数据库中并以sp_ 为前缀,并且系统存储过程主要是从系统表中获取信 息,从而为系统管理员管理SQL Server 提供支持。 通过系统存储过程,MS SQL Server 中的许多管理 性或信息性的活动(如了解数据库对象、数据库信息) 都可以被顺利有效地完成。 系统存储过程也可以在其它数据库进行调用,当 创建一个新数据库时,一些系统存储过程会在新数据 库中被自动创建。 • 用户自定义存储过程是由用户创建并能完成某一 特定功能(如查询用户所需数据信息)的存储过程。
存储过程的编写格式(续)
FROM authors a INNER JOIN titleauthor ta ON a.au_id = ta.au_id INNER JOIN titles t ON t.title_id = ta.title_id INNER JOIN publishers p ON t.pub_id = p.pub_id WHERE au_fname = @firstname AND au_lname = @lastname GO
第5章
5.1 5.2 5.3 5.4 5.5
数据库对象的操作
表操作 视图操作 索引操作 存储过程 触发器
存储过程的概念
存储过程Stored Procedure 是一组为了完 成特定功能的SQL 语句集,经编译后存储在数据 库中。用户通过指定存储过程的名字并给出参数 (如果该存储过程带有参数)来执行它。
5.4 存储过程
创建存储过程 执行存储过程
创建存储过程
创建存储过程时,需要确定存储过程的三个组成 部分: ①所有的输入参数以及传给调用者的输出参数。 ②被执行的针对数据库的操作语句,包括调用其 它存储过程的语句。 ③返回给调用者的状态值,以指明调用是成功还 是失败。
1. 使用企业管理器创建存储过程
(2)使用命令修改触发器正文
alter trigger命令的语法形式如下:
联机文档 alter trigger索引去查询各参数的含义
ALTER TRIGGER trigger_name ON(table|view) [WITHENCRYPTION] { { ( FOR | AFTER | INSTEAD OF ) { [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] } [NOTFORREPLICATION] AS sql_statement[...n]} |
练习
建立存储过程:查看不同时期出版的书籍 信息。
存储过程的编写格式
USE pubs GO CREATE PROCEDURE au_info @lastname varchar(40), @firstname varchar(20) AS SELECT au_lname, au_fname, title, pub_name
相关文档
最新文档