第10章 触发器和游标
- 格式:ppt
- 大小:357.00 KB
- 文档页数:39
创建触发器为了演示触发器的功能,下面再引入一个简易仓库管理的例子。
在采购配件前,必须首先制定采购计划(如采购计划表 PlanA),然后交由采购员采购,采购回来后,要将配件入库,入库时,除了要修改入库表(配件入库表 InStock)外,还要修改配件库存表(仓库库存表 Stock),还要修改采购计划表(采购计划表 PlanA),因为要修改实际完成的采购量(FinishQty)。
三个数据表如下:采购计划表 PlanA备件入库表 InStock备件库存表 Stock给计划表追加如下数据一、用企业管理器创建触发器例1:对备件入库InStock表建立一个插入触发器utr_InStockIns,其功能为:备件入库时,除了要将入库数据追加到备件入库表(InStock)外,还要修改计划表(PlanA)中对应计划号的完成数量(增加FinishQty)和备件库存表(Stock)中对应备件代码的库存数量(StockQty)。
注:同企业管理器创建的触发器例2:对备件入库表建立一个删除触发器utr_InStockDel,其功能为:删除备件入库中的记录时,除了要删除入库表(InStock)的记录外,还要修改计划表(PlanA)中对应计划号的完成数量(减少FinishQty),还要删除备件库存表(Stock)中对应备件代码的记录。
例3:对备件入库表建立一个更改除触发器utr_InStockUpt,其功能为:更改备件入库中的记录时,除了要更改入库表(InStock)的记录外,还要更改备件库存表(Stock)中对应备件代码的数据,同时,还要更改计划表(PlanA)中对应计划号的完成数量(FinishQty)。
触发器的应用假设你已经按照4.2.3创建触发器中要求创建了插入触发器utr_InStockIns、删除触发器utr_InStockDel和更改触发器utr_InStockUpt,才能做下面的实验。
可以参见4.2.4管理触发器来检查是否已经创建。
数据库中的游标存储过程和触发器游标、存储过程和触发器是数据库中常用的三种特殊对象。
游标用于在数据库管理系统中对查询结果进行逐行处理,存储过程是一组预定义的SQL语句集合,可以被重复调用执行,而触发器则是在数据库中的特定事件发生时自动执行的一段代码。
首先,我们来了解一下游标。
游标是一个数据库概念,它可以被看作是一个指向查询结果集的指针。
通过游标,我们可以在数据库内部对查询结果集进行逐行处理,从而实现对数据的操作。
游标的使用可以有效地减少数据库服务器的负担,提高数据库性能。
在一些需要对批量数据进行处理的场景下,游标可以发挥重要作用。
例如,当需要对查询结果逐行进行计算、更新或者删除时,可以使用游标定位到每一条记录,并对其进行操作。
接下来,我们了解一下存储过程。
存储过程是一组预定义的SQL语句的集合,它们一起执行一些特定的任务。
存储过程可以包含流程控制、循环结构、条件判断等逻辑,还可以接受参数并返回结果。
存储过程的好处在于可以实现代码复用,提高数据库的性能和可维护性。
通过存储过程,我们可以将常用的SQL操作封装起来,减少了网络传输的开销,提高了数据访问的效率。
另外,存储过程还可以实现权限控制,通过调用存储过程来间接访问数据库,可以避免直接在应用程序中操作数据库,增强了数据的安全性。
最后,我们来了解一下触发器。
触发器是在数据库中特定的事件发生时自动执行的一段代码。
这些事件可以是INSERT、UPDATE或者DELETE操作。
触发器通常被用来在数据库表的数据发生变化时执行相应的操作。
它可以用来保证数据库的数据一致性和完整性,触发器能够在数据被修改之前或之后自动执行,并且可以在代码中加入逻辑判断和业务处理。
例如,在一个订单表中,我们可以定义一个触发器,在插入一条新订单数据时,自动计算订单总金额并更新到订单的总金额字段中。
总结一下,游标、存储过程和触发器是对数据库进行处理和控制的重要工具。
游标可以让我们逐行处理查询结果集,存储过程可以定义逻辑处理、实现代码的复用,而触发器则可以在数据库表的特定事件发生时自动执行一段代码。
MySQL中触发器和游标的介绍与使⽤触发器简介触发器是和表关联的特殊的存储过程,可以在插⼊,删除或修改表中的数据时触发执⾏,⽐数据库本⾝标准的功能有更精细和更复杂的数据控制能⼒。
触发器的优点:安全性:可以基于数据库的值使⽤户具有操作数据库的某种权利。
例如不允许下班后和节假⽇修改数据库数据;审计:可以跟踪⽤户对数据库的操作;实现复杂的数据完整性规则。
例如,触发器可回退任何企图吃进超过⾃⼰保证⾦的期货;提供了运⾏计划任务的另⼀种⽅法。
例如,如果公司的帐号上的资⾦低于 5 万元则⽴即给财务⼈员发送警告数据。
MySQL 中使⽤触发器创建触发器创建触发器的技巧就是记住触发器的四要素:监控地点:table;监控事件:insert/update/delete;触发时间:after/before;触发事件:insert/update/delete。
创建触发器的基本语法如下所⽰:CREATE TRIGGER-- trigger_name:触发器的名称;-- tirgger_time:触发时机,为 BEFORE 或者 AFTER;-- trigger_event:触发事件,为 INSERT、DELETE 或者 UPDATE;trigger_name trigger_time trigger_eventON-- tb_name:表⽰建⽴触发器的表名,在哪张表上建⽴触发器;tb_name-- FOR EACH ROW 表⽰任何⼀条记录上的操作满⾜触发事件都会触发该触发器。
FOR EACH ROW-- trigger_stmt:触发器的程序体,可以是⼀条 SQL 语句或者是⽤ BEGIN 和 END 包含的多条语句;trigger_stmttrigger_name:触发器的名称;tirgger_time:触发时机,为 BEFORE 或者 AFTER;trigger_event:触发事件,为 INSERT、DELETE 或者 UPDATE;tb_name:表⽰建⽴触发器的表名,在哪张表上建⽴触发器;trigger_stmt:触发器的程序体,可以是⼀条 SQL 语句或者是⽤ BEGIN 和 END 包含的多条语句;FOR EACH ROW 表⽰任何⼀条记录上的操作满⾜触发事件都会触发该触发器。
实训10 触发器1、实训目的(1)理解触发器的作用(2)掌握创建触发器的方法;(3)掌握查看触发器信息的方法;(4)掌握删除和修改触发器的方法。
2、素材准备SQL Server 2005,Xk数据库,YGGL数据库。
实验准备:1)创建用于企业管理的员工管理数据库,数据库名为YGGL,包含员工的信息、部门信息以及员工的薪水信息。
数据库YGGL包含下列3个表:(1)employees:员工信息表。
(2)departments:部门信息表。
(3)salary:员工薪水情况表。
各表的结构如下:employees表结构2)在企业管理器中向表employees,departments、salary中加入记录employees表departments表salary表3、实训内容3.1基本训练1、完成教材中的例题。
(50分钟)2、对于yggl数据库,表employees的departmentid列与表departments的departmentid列应满足参照完整性规则,即:●向employees表添加一记录时,该记录的departmentid值在departments表中应存在。
●修改departments表的departmentid字段值时,该字段在employees表中的对应值也应该修改。
●删除departments表中一记录时,该记录的departmentid字段值在employees表中对应的记录也应该删除。
上述参照完整性规则,在此通过触发器实现。
3、对于yggl数据库,表employees的employeeid列与表salary的employeeid列应该满足参照完整性规则,请用触发器实现两个表间的参照完整性。
●向salary表添加一记录时,该记录的employeeid值在employees表中应存在。
●修改employees表的employeeid字段值时,该字段在salary表中的对应值也应该修改。
游标,存储过程,触发器的区别与使⽤⼀、游标*什么是游标游标实际上是⼀种能从包括多条数据记录的结果集(结果集是select查询之后返回的所有⾏数据的集合)中每次提取⼀条记录的机制充当指针的作⽤,遍历结果中的所有⾏,但他⼀次只指向⼀⾏。
游标的结果集是由SELECT语句产⽣,如果处理过程需要重复使⽤⼀个记录集,那么创建⼀次游标⽽重复使⽤若⼲次,⽐重复查询数据库要快的多。
也可以说,SQL的游标是⼀种临时的数据库对象,可以⽤来存放在数据库表中的数据⾏副本,也可以指向存储在数据库中的数据⾏的指针。
游标提供了在逐⾏的基础上操作表中数据的⽅法。
⼀般复杂的存储过程,都会有游标的出现,他的⽤处主要有:1.定位到结果集中的某⼀⾏。
2.对当前位置的数据进⾏读写。
3.可以对结果集中的数据单独操作,⽽不是整⾏执⾏相同的操作。
4.是⾯向集合的数据库管理系统和⾯向⾏的程序设计之间的桥梁。
*不⾜:数据量⼩时才使⽤游标,因为:1.游标使⽤时会对⾏加锁,系统上跑的不只我们⼀个业务,这就会影响其他业务的正常进⾏;2.数据量⼤时其效率也较低效;3.游标其实是相当于把磁盘数据整体放⼊了内存中,如果游标数据量⼤则会造成内存不⾜,书写格式:DECLARE mycursor Cursor --定义游标FOR SELECT EmployeeID FROM ... --查询语句OPEN mycursor --打开游标DECLARE @id int --根据查询语句相应地定义变量FETCH NEXT FROM mycursor INTO @id --逐⾏提取游标集中的⾏WHILE @@FETCH_STATUS=0 --通过检查全局变量@@FETCH_STATUS来判断是否已读完游标集中所有⾏BEGIN*此处书写要执⾏的Sql语句*FETCH NEXT FROM mycursor INTO @id --移动游标ENDCLOSE mycursor --关闭游标DEALLOCATE mycursor --释放游标实例:根据产品名称(名称⼀样视为同⼀产品)统计该产品的销售数量,如果在统计表(ProductStatistics)中能找到这个产品名称的数据,则插⼊这个产品的统计结果,如果不能找到这个产品名称的数据,则修改统计结果。