触发器和存储过程

本文详细介绍了数据库中的存储过程和触发器的概念、特点及应用。涵盖了存储过程的各种类型如系统存储过程、用户定义存储过程等,并展示了如何创建、执行、更新及删除存储过程。同时,文章还解释了触发器的作用及其创建方法。

触发器存储过程

1.       存储过程和触发器是什么?

存储过程不能可以显著提高系统的执行速度,还能提高效率确保一致性.

1.1存储过程:一种数据库对象,将负责不同功能的语句分类放置起来,以便能反复使用.

1.2特点:

1.3存储过程的分类

分为五类,系统存储过程,用户定义存储过程,临时存储过程,远程存储过程,扩展存储过程.

临时存储过程又分为本地临时存储过程,全局临时存储过程.

分类

说明

系统存储过程

存储在master中,以sp开头,调用时不必加库名,如果参数是保留字或者数据库对象,用单引号包围.

用户定义存储过程

用户为完成一定的功能定义在数据库中存储过程.

临时存储过程

本地临时:#开头,放在tempdb中,连接断开之后自动删除,本库使用.

全局临时:##开头,放在tempdb中,连接断开后使用完之后自动删除,本连接的所有库可以使用.注意命名.

远程存储过程

位于远程服务器上的存储过程.通过分布式查询和execute执行.

扩展存储过程

外部程序写的存储过程,xp开头,动态链接库形式存在,也放在master

1.4存储过程优点

1.5存储过程和视图的比较

 

1.6创建存储过程

格式:

例子:

create procedure ShowAllStudent

as

begin

select * from students

end

1.7执行存储过程

格式:exec procedure_name

例子:exec  ShowAllStudent

1.8带输入参数存储过程

格式:

 

例子:

create procedure SelectStudentByStu_no

@sno char(12)='200501020319'

as

begin

select * from students where stu_no=@sno

end

1.9执行带输入参数的存储过程

格式:

 

例子:

exec SelectStudentByStu_no

@sno='200501030218'

当参数比较少的时候,可以按照位置传递参数.

例子:

exec SelectStudentByStu_no '200501030218'

1.10带输出参数的存储过程

格式:

 

例子:

create procedure GetStudentCountByStu_sex

@sex char(2)='',

@count int=0 output

as

begin

set

@count=(select count(*) from students where stu_gender=@sex)

print @count

end

 

执行带输出参数的存储过程

例子:

declare @sex char(2) ,@count int

set @sex=''

exec GetStudentCountByStu_sex @sex,@count

1.11    删除存储过程

Drop procedure GetPostsByBlogId

1.12      更新存储过程

alter procedure GetPostsByBlogId

(@blogid varchar(50))

As

Select top 5* from Posts where BlogId=@blogid

1.13      重命名存储过程

对象浏览器中修改.

1.14      重新编译存储过程

 有三种方法:

1)创建的时候使用with Recompile 语句.

2)在执行过程中设定重新编译

3)调用系统存储过程重新编译

2.      触发器

基本表被在修改的时候通过事件触发而执行的存储过程.

作用是保证了由主键和外键所不能保证的参照完整性和数据完整性.

2.1触发器的优点

触发器可以包含复杂的处理逻辑,主要用来保持低级的数据完整性.优点如下.

 

2.2创建触发器

删除触发器:

例子:

create trigger dropStudent

on students

for delete

as

print '成功删除一条数据.'

更新触发器:

create trigger updateStudentName

on students

for update

as

if update (stu_name)

begin

print '不能更新主键,学生号码.'

rollback transaction

end

 

update students set

stu_name='五哥'

where stu_no='200501020319'

 

删除触发器:略

查看触发器:

1)    

使用系统的存储过程查看: exec sp_helptrigger students 

使用系统表: select name from sysobjects where type='TR'

 

2)     管理器查看 略

删除触发器: drop trigger updateStudent

修改触发器:

 重命名: sp_rename dropStudent,deleteStudentItem

启动和停止触发器:

alter table students enable trigger all

转载于:https://www.cnblogs.com/powerzhang/p/3505098.html

<think>好的,我现在需要帮用户弄清楚MySQL中触发器存储过程的用法以及它们的区别。首先,我得回忆一下自己对这两个概念的理解,并确认是否正确。 触发器,我记得是在特定数据库操作(比如INSERT、UPDATE、DELETE)发生时自动执行的存储程序。用户提到的引用[1]中也提到,触发器分为三种类型:INSERT、UPDATEDELETE触发器触发器的执行是自动的,不需要手动调用,所以可能用于数据验证、审计日志或是维护数据一致性等场景。比如,当插入一条新记录时,触发器可以自动更新某个统计存储过程则不同,引用[3]提到,存储过程需要显式地通过CALL或EXECUTE来调用,可以包含复杂逻辑,比如控制构(if、while等),并且能果。存储过程更像是一个预定义的函数,把一系列SQL语句封装起来,方便重用。例如,处理订单时可能需要个步骤,用存储过程可以把这些步骤集中管理,提高效率并减少网络传输,因为应用程序只需调用一次存储过程而不是发送个SQL语句。 接下来是区别部分。触发器存储过程的主要区别在于触发方式用途。触发器是事件驱动的,自动触发,而存储过程需要显式调用。触发器的应用场景更数据变动相关的自动处理,而存储过程用于封装复杂的业务逻辑。此外,触发器不能直接果,而存储过程可以查询果或输出参数。引用[3]还指出,存储过程可以包含控制构,这可能比触发器更灵活。 还要考虑它们的创建管理方式。触发器的创建语法是CREATE TRIGGER,需要指定触发事件时机(BEFORE/AFTER)。而存储过程用CREATE PROCEDURE,可以定义参数回类型。触发器可能对性能有影响,尤其是在处理大量数据时,因为每个相关操作都会触发执行。而存储过程的性能优势在于减少数据库交互,但设计不当也可能成为瓶颈。 用户可能还关心实际应用中的选择。比如,何时用触发器,何时用存储过程。例如,审计日志适合用触发器,因为需要在数据变动时自动记录;而复杂的业务逻辑如月度报生成可能更适合存储过程,按需调用。 需要验证自己的理解是否正确,比如触发器的执行权限、存储过程能否处理事务等。根据引用[2],存储过程中的变量作用域在过程内部,类似Java的方法局部变量,而触发器中变量的使用可能受限,因为触发器特定的事件绑定。 最后,用户可能希望知道使用它们的最佳实践潜在问题,比如触发器的递归触发风险,存储过程的调试维护难度。这些都是需要提及的。</think>### MySQL触发器存储过程的用法及区别解析 #### 一、触发器(Trigger)的用法 1. **定义与触发条件** 触发器是一种与事件绑定的特殊存储程序,在特定操作($INSERT$、$UPDATE$、$DELETE$)执行时**自动触发**。例如: ```sql CREATE TRIGGER audit_log AFTER INSERT ON orders FOR EACH ROW BEGIN INSERT INTO log_table VALUES (NEW.order_id, NOW()); END; ``` 此触发器会在`orders`插入数据后自动记录日志[^1]。 2. **类型与时机** - 支持`BEFORE`(操作前触发)`AFTER`(操作后触发)两种时机 - 分为三种类型:`INSERT`触发器、`UPDATE`触发器、`DELETE`触发器 3. **典型应用场景** - 数据审计(如记录修改痕迹) - 级联更新(如更新库存时自动调整统计) - 约束补充(如实现复杂业务规则校验) --- #### 二、存储过程(Stored Procedure)的用法 1. **定义与调用方式** 存储过程是一组预编译的SQL语句集合,需通过`CALL`命令显式调用: ```sql CREATE PROCEDURE CalculateSales(IN year INT) BEGIN SELECT SUM(amount) FROM sales WHERE YEAR(order_date) = year; END; -- 调用示例 CALL CalculateSales(2023); ``` 支持输入/输出参数,可查询果[^3]。 2. **功能特性** - 支持变量声明(如`DECLARE total INT DEFAULT 0;`) - 支持流程控制(如`IF...THEN`、`WHILE`循环) - 可嵌套调用其他存储过程[^2] 3. **典型应用场景** - 复杂业务逻辑封装(如订单算流程) - 批量数据处理(如定期统计报生成) - 权限控制(通过存储过程限制直接访问) --- #### 三、核心区别对比 | **特性** | **触发器** | **存储过程** | |------------------------|-----------------------------------|---------------------------------| | 触发方式 | 自动由事件触发 | 需显式调用`CALL`执行 | | 回值 | 不能直接果 | 可通过`OUT`参数或果集数据 | | 事务控制 | 默认在触发语句的事务中执行 | 可独立声明事务(`BEGIN TRANSACTION`)| | 应用场景 | 数据变更的联动操作 | 复杂业务逻辑封装 | | 性能影响 | 高频操作可能引发级联性能问题 | 预编译减少解析开销,但需注意设计合理性 | --- #### 四、选择建议 1. **优先使用触发器** - 需要保证数据一致性的自动化操作(如审计日志) - 简单级联更新(如更新订单状态后同步库存) 2. **优先使用存储过程** - 步骤复杂业务逻辑(如用户注册流程包含校验、插入、发邮件) - 需要复用或对外提供标准化接口的操作 3. **注意事项** - 避免在触发器中嵌套复杂逻辑,可能导致性能瓶颈 - 存储过程版本管理需谨慎,修改可能影响个调用点 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值