数据库实验-触发器的定义
- 格式:doc
- 大小:508.00 KB
- 文档页数:12
数据库触发器的使用与注意事项数据库触发器是一种在数据库管理系统中常用的工具,它可以在特定事件发生时自动执行一系列的操作。
触发器可以用于保证数据的完整性、实现复杂的业务逻辑和处理数据库的变化。
本文将介绍数据库触发器的使用方法,并重点介绍在使用触发器时需要注意的事项。
一、数据库触发器的基本概念在数据库中,触发器是与表相关联的特殊对象,它会在表上的特定事件(如插入、更新、删除操作)发生时自动触发。
触发器可以在事件发生之前(BEFORE)或之后(AFTER)执行所定义的操作。
触发器通常由三个主要部分组成:事件、触发时间和触发操作。
事件指的是触发器所关联的数据库操作,常见的事件包括插入(INSERT)、更新(UPDATE)和删除(DELETE)操作。
触发时间指的是触发器的执行时间,即事务执行之前或之后。
触发操作指的是触发器执行的具体操作,可以是SQL语句、存储过程等。
二、数据库触发器的使用方法1. 创建触发器在大多数数据库管理系统中,创建触发器需要使用CREATE TRIGGER语句。
CREATE TRIGGER语句通常包括触发器的名称、触发时间、触发事件和所需执行的操作。
例如,以下是创建一个在学生表插入操作之前触发,执行一条SQL语句的触发器的示例:CREATE TRIGGER before_insert_studentBEFORE INSERT ON studentFOR EACH ROWBEGIN-- 执行操作INSERT INTO log_table (operation) VALUES ('Inserting student');END;2. 修改触发器在需要修改触发器时,可以使用ALTER TRIGGER语句。
ALTER TRIGGER语句通常包括触发器的名称、触发时间、触发事件和所需执行的操作。
例如,以下是修改触发器的示例:ALTER TRIGGER before_insert_studentAFTER INSERT ON studentFOR EACH ROWBEGIN-- 执行其他操作UPDATE audit_table SET operation = 'Student inserted' WHERE id = NEW.id;END;3. 删除触发器如果不再需要某个触发器,可以使用DROP TRIGGER语句将其从数据库中删除。
数据库触发器的原理与应用数据库触发器是一种数据库对象,它是在特定事件发生时自动执行的一段代码。
触发器通常用于在数据库表的插入、更新或删除操作之前或之后执行特定的逻辑。
数据库中的触发器可提供数据完整性、业务逻辑处理和日志跟踪等功能。
本文将介绍数据库触发器的原理和应用。
一、数据库触发器的原理数据库触发器通过特定的触发事件来执行代码逻辑。
触发事件可以是数据表的插入(INSERT)、更新(UPDATE)或删除(DELETE)操作。
当这些操作发生时,触发器会在预设的时间点(通常在操作之前或之后)自动触发执行。
触发器由两个核心部分组成,分别是触发事件和触发操作。
触发事件是触发器被激活的条件,它可以是特定表的插入、更新或删除操作。
触发操作是在触发事件发生时执行的一段代码,通常用于实现数据完整性、业务逻辑处理或日志记录等功能。
触发器可以分为行级触发器和语句级触发器。
行级触发器在每一行的操作发生时被触发执行,而语句级触发器在整个SQL语句执行完毕后才触发执行。
二、数据库触发器的应用数据库触发器在实际应用中有广泛的用途,下面将介绍几个常见的应用场景。
1. 数据完整性约束触发器可以用于实现数据完整性的约束。
例如,当向员工表中插入一条新记录时,可以使用触发器检查该员工的相关信息是否满足某些条件,比如工号必须唯一、薪资范围必须符合规定等。
如果不满足条件,触发器可以抛出错误提示或自动修复数据。
2. 日志记录与审计通过触发器,可以实现数据库操作的日志记录与审计。
例如,可以在表的更新操作之后自动记录修改的详细内容,包括修改前的值和修改后的值。
这样可以帮助进行数据追溯、审计追踪以及降低操作错误的风险。
3. 数据复制与同步触发器可以用于实现数据的复制与同步。
当源表数据发生变化时(插入、更新或删除),触发器可以自动将变化的数据复制到目标表中,以实现数据的同步。
这在需要实时数据备份或数据分发的场景中非常有用。
4. 业务逻辑处理触发器可以用于实现特定的业务逻辑处理。
什么是触发器?触发器的使用场景有哪些?在数据库管理系统中,触发器(Trigger)是一种与表关联的存储过程,它在表上的特定事件(如插入、更新、删除)发生时自动执行。
触发器可以用来实现在数据变更前后执行特定的操作,例如验证、日志记录、数据同步等。
触发器的基本特点:事件驱动:触发器是与特定的数据库事件关联的,如INSERT、UPDATE、DELETE 等。
自动执行:当触发器关联的事件发生时,触发器会自动执行相应的操作,而不需要手动触发。
与表关联:触发器是与特定表关联的,通常在表的创建时定义触发器。
触发器的使用场景:数据验证和完整性:在插入、更新或删除数据前后,使用触发器对数据进行验证和保持完整性。
例如,确保某些字段不为 NULL,或执行外键约束。
日志记录和审计:在数据变更前后,记录变更的日志,以便进行审计和追踪。
派生数据的更新:当表中的数据发生变更时,更新其他表中的相关数据,保持派生数据的一致性。
自动计算字段:在某个字段发生变更时,触发器可以用于自动计算相关字段的值,而不需要手动更新。
数据同步:当一个表的数据发生变更时,使用触发器将相关数据同步到其他表,保持数据的一致性。
复杂约束的实现:在某些情况下,复杂的业务规则或约束无法通过常规的约束机制实现,可以通过触发器来进行自定义处理。
触发器的基本语法:在不同的数据库系统中,触发器的语法可能有所不同。
以下是一个通用的触发器创建语法:sqlCopy codeCREATE TRIGGER trigger_nameBEFORE/AFTER INSERT/UPDATE/DELETE ON table_nameFOR EACH ROWBEGIN-- 触发器逻辑END;BEFORE/AFTER 指定触发器在事件发生前或发生后执行。
INSERT/UPDATE/DELETE 指定触发器关联的事件。
FOR EACH ROW 指定触发器对每一行执行一次。
需要根据具体的数据库系统来了解和使用触发器的相关语法和规范。
触发器的名词解释触发器(Trigger)是计算机科学领域中常用的术语,它指的是在特定条件被满足时自动触发执行某种指令或操作的一种机制。
可以说,触发器就是一种与事件相关的特殊程序或模块,它能够监控、处理并响应指定的事件。
在计算机系统中,触发器常被用来实现自动化的任务调度、事件管理和反应机制。
无论是在数据库系统中,还是在操作系统中,触发器都扮演着重要的角色。
通过设置和管理触发器,我们可以使得计算机系统根据特定事件的发生自动产生某种动作或响应,从而提高系统的效率和安全性。
触发器可以分为两类:时间触发器(Time Trigger)和事件触发器(Event Trigger)。
时间触发器是通过设置固定的时间间隔或特定的时间点来触发指定事件。
例如,在操作系统中,可以设置每天早上8点触发备份操作,或者每月最后一天触发数据清理操作。
这样一来,我们就不需要手动执行这些操作,而是交给触发器自动处理。
而事件触发器则是通过特定的事件或条件来触发执行某种操作。
这些事件可以是用户的输入、特定的指令或者系统状态的改变等。
例如,在数据库系统中,我们可以设置一个触发器,当某个表中某一列的数值发生变化时,自动触发一段程序进行相应的操作,比如更新其他相关的表格或发送通知。
触发器的设置和管理通常需要通过编程或系统配置来完成。
这就要求用户具有一定的计算机技术知识和经验。
在数据库系统中,可以使用SQL语句来定义和管理触发器。
而在操作系统中,可以利用任务调度器或者编写脚本来实现触发器的功能。
触发器的应用领域非常广泛。
在企业级应用系统中,触发器常被用于数据同步、数据更新和事务处理等方面。
通过合理设置触发器,可以保证数据的一致性和完整性。
在网络安全领域,触发器也被用来检测和防止恶意攻击或非法访问。
当特定的网络流量或异常行为被监测到时,触发器可以立即采取相应的安全措施,保护系统和用户的安全。
总之,触发器作为一种自动化的机制,对于提高计算机系统的效率、安全性和可靠性起到了重要的作用。
触发器是一种特殊类型的数据库对象,它以某种形式保护特定的数据库表,以有助于实现数据库的安全性及效率。
在普通的数据库中,触发器可以检测某种特定的数据行更改,并采取更具体的行为来支持系统安全性、完整性或数据访问控制。
触发器是在特定的操作之前(即触发时)或之后(即执行时)自动执行的“任务列表”,这些任务可能包括比如检查数据完整性、矫正数据格式、约束数据记录等操作。
触发器的使用有助于数据库的更新、安全性和性能的提高。
触发器有三种类型,分别是BEFORE TRIGGER,AFTER TRIGGER和INSTEAD OF TRIGGER。
BEFORE TRIGGER在实施特定操作之前触发,而AFTER TRIGGER是在特定操作完成之后触发。
INSTEAD OF TRIGGER允许开发者为实施操作时,立即覆盖原始操作。
触发器也可以用来维护(maintain)数据完整性和统计数据。
例如,在一个数据库中,如果某个表的销售记录被修改,触发器可以自动调整订单的总价格。
另外,触发器也可以用来管理用户访问,可以阻止非法或恶意用户访问数据库。
这种方法有助于保护敏感信息,提高数据库系统的性能和安全性。
总之,触发器是现代数据库系统中一种非常重要的概念,它有助于大大提高系统的效率,并为用户提供更加安全和可靠的数据系统。
(trigger)触发器的定义和作⽤第⼀:触发器(trigger)触发器(trigger)是指隐含执⾏的存储过程procedure,当定义触发器时必须要指定触发事件和触发的操作,通常触发事件包括insert,update,delete语句,触发器实际上就是⼀个pl/sql(procedure language/Structured Query Language).create trigger来创建触发器;第⼆:触发器的作⽤;a.允许/限制对表的修改b.⾃动派⽣列,如⾃增字段c.强制数据的⼀致性d.提供审计和⽇志记录e.防⽌⽆效的事务处理f.启动复杂的业务逻辑第三:触发器的语法;Sql代码1. create or replace trigger temp_trigger ---定义⼀个触发器 temp_trigger2. after|before|instead of ---指定触发时机和触发类型3. insert|update|delete ---指定触发事件4. of columns_name on table_name ---of & on 监控的表单和表列5. referencing6. old as old_value7. new as new_value8. for each row|for each statement ---指定触发次数(⾏和语句)9. begin10. codes11. end;create or replace trigger temp_trigger ---定义⼀个触发器 temp_triggerafter|before|instead of ---指定触发时机和触发类型insert|update|delete ---指定触发事件of columns_name on table_name ---of & on 监控的表单和表列referencingold as old_valuenew as new_valuefor each row|for each statement ---指定触发次数(⾏和语句)begincodesend;instead of是⼀种单独的出发机制,⽤来管理和执⾏view类型的数据表单of &on监控关键字 of 可以省区,on是必须留下的第四:例⼦instancea:创建⼀个⾏触发器 triSql代码1. create or replace trigger tri ---trigger tri2. before insert or update on employee3. referencing old as old_value4. new as new_value5. for each row6. when(new_value.empid<>'14') ---当插⼊的empid不等于147. begin8. :new_value.salary:=2001; ---将插⼊的的salary更改成20019. end;create or replace trigger tri ---trigger tribefore insert or update on employeereferencing old as old_valuenew as new_valuefor each rowwhen(new_value.empid<>'14') ---当插⼊的empid不等于14begin:new_value.salary:=2001; ---将插⼊的的salary更改成2001end;触发事件:Sql代码1. insert into employee values(emp_seq.nextval,'Janney',10,'1'); ---插⼊⼀条数据2.3. update employee set employee.empname='Alex' where employee.empid='12'; --根新empid=15的数据insert into employee values(emp_seq.nextval,'Janney',10,'1'); ---插⼊⼀条数据update employee set employee.empname='Alex' where employee.empid='12'; --根新empid=15的数据结果:分析:对⽐发现,⽆论你修改或增加数据只要empid!=14,salary都固定在2001。
什么是触发器触发器(Trigger)是数据库管理系统(DBMS)中的一种特殊对象,它与表相关联,并在表上的特定事件发生时自动执行一系列操作。
触发器能够对表的数据进行监测和处理,通常被用于实施复杂的业务逻辑或维护数据的完整性。
触发器的作用触发器可以分为两种类型:行级触发器和语句级触发器。
行级触发器在表中每一行受到影响时触发,而语句级触发器则在表上的整个语句执行完成后触发。
触发器主要有以下作用:1. 数据完整性维护:通过在触发器中设置一些约束条件,可以确保插入、更新或删除操作不会违反数据的完整性。
例如,在删除一条订单数据时,可以通过触发器检查是否有关联的订单详情信息,并根据需求执行相应的操作。
2. 业务逻辑实现:逻辑复杂的业务规则可以通过触发器在数据库层面上实现,减少应用程序的复杂度。
例如,在一个电子商务系统中,可以通过触发器在订单表上实现自动计算总价、更新库存等功能。
3. 数据同步:当表之间存在关联关系时,通过触发器可以实现数据的同步。
例如,在一个学生信息管理系统中,当学生信息表中的某个字段发生改变时,可以通过触发器自动更新其他相关表中的对应字段。
触发器的语法触发器的语法在不同的数据库管理系统中可能有所不同,以下是一个常见的触发器语法示例:CREATE TRIGGER trigger_nameAFTER INSERT OR DELETE OR UPDATE ON table_nameFOR EACH ROWBEGIN-- 触发器逻辑END;在以上示例中,trigger_name是触发器的名称,table_name是触发器相关联的表的名称。
AFTER INSERT OR DELETE OR UPDATE指定了触发器在插入、删除或更新操作后触发。
FOR EACH ROW表示触发器的粒度为行级,即每一行受到影响时都会触发。
触发器的使用注意事项在使用触发器时,有一些注意事项需要注意:1. 触发器的逻辑应尽量简洁高效,避免对数据库性能造成过大的影响。
触发器的认识和应用实验报告
触发器是一种特殊类型的存储过程,用于在指定表中对数据进行修改时生效。
它主要用于强制复杂的业务规则或要求,例如控制是否允许基于顾客的当前帐户状态插入定单。
触发器还有助于强制引用完整性,以便在添加、更新或删除表中的行时保留表之间已定义的关系。
在实验中,我们可以使用触发器来实现各种功能。
例如,我们可以创建一个更新触发器,当指定的表被更新时,触发器会执行特定的操作。
我们可以创建一个删除触发器,当指定的表被删除时,触发器会执行特定的操作。
我们还可以创建一个插入触发器,当指定的表被插入时,触发器会执行特定的操作。
通过实验,我们深入了解了触发器的基本概念和应用。
我们学习了如何在数据库中创建和查询触发器,并了解了触发器在不同业务场景下的应用。
我们还学习了如何使用触发器来实现复杂的业务规则和要求,例如对价格低于 10 美元的书应用折扣等。
通过本次实验,我们掌握了触发器的基本概念和应用,提高了我们对数据库编程的理解和掌握。
我们相信,本次实验对于我们未来的数据库编程和应用将有着重要的意义。
数据库触发器的使用与实践数据库触发器是一种在特定数据库事件发生时自动执行的代码块。
它们可以用于实现数据库的业务逻辑、数据完整性以及与其他系统之间的数据同步等功能。
在这篇文章中,我们将探讨数据库触发器的使用方法以及实际应用场景,并通过实例展示触发器的用法。
一、数据库触发器的定义和类型数据库触发器是一个存储过程,它与一个特定的数据库表相关联。
在定义触发器时,我们需要指定它要响应的事件类型,比如插入、更新或删除数据。
当相关的事件发生时,触发器会自动执行。
根据触发器执行的时机和次数,可以将触发器分为三类:1.前置触发器(Before Trigger):在触发事件之前执行,并可以通过修改数据来影响触发事件的结果。
2.后置触发器(After Trigger):在触发事件之后执行,通常用于记录日志或进行其他与业务逻辑无关的操作。
3.代替触发器(Instead Of Trigger):在触发事件之前执行,并完全替代原始操作,常用于在视图上进行删除、插入或更新操作。
二、数据库触发器的创建和使用创建触发器的语法可能因不同的数据库系统而有所不同。
我们以MySQL为例,介绍触发器的创建和使用。
1.创建触发器CREATE TRIGGER trigger_name -- 触发器名称BEFORE/AFTER/INSTEAD OF {INSERT/UPDATE/DELETE} -- 触发事件类型ON table_name -- 相关联的表名FOR EACH ROW -- 对每一行进行触发BEGIN-- 触发器的执行逻辑,可以包括SQL语句和存储过程等END;2.使用触发器当触发器创建完成后,我们可以通过插入、更新或删除数据来触发它。
触发器会自动执行定义好的逻辑。
三、数据库触发器的应用场景数据库触发器在实际应用中具有广泛的用途。
下面我们将介绍一些常见的应用场景。
1.数据完整性约束触发器可以用于实现数据完整性约束,比如在插入或更新数据之前进行检查,确保数据符合特定的规则或约束条件。
数据库触发器的设计与实现在数据库管理系统中,触发器是一种自动执行特定操作的程序代码。
它们可以在数据库中的特定事件发生时被激活,比如插入、更新或删除操作。
触发器是一种很有效的方式来维护数据库的一致性和完整性,同时也可以简化应用程序开发过程。
本文将探讨数据库触发器的设计与实现,包括触发器的定义、触发器的类型和触发器的实现方式。
触发器的定义:在关系型数据库中,触发器是与表相关联的一段代码或存储过程。
当表发生特定事件时,触发器会被自动激活,并执行其中的代码。
触发器可以在数据的插入、更新或删除时触发,以执行相应的操作。
触发器可以用于保持数据的一致性,实施业务规则,或者进行验证。
触发器的类型:数据库触发器可以分为三种类型:插入触发器、更新触发器和删除触发器。
插入触发器:当向表中插入新的数据时,插入触发器会被激活并执行相应的操作。
插入触发器可以用于检查插入的数据的有效性,或者在插入数据后进行其他的业务逻辑操作。
更新触发器:当表中的数据被更新时,更新触发器会被激活并执行相应的操作。
更新触发器可以用于强制实施业务规则,或者在更新数据后进行其他的数据处理。
删除触发器:当表中的数据被删除时,删除触发器会被激活并执行相应的操作。
删除触发器可以用于执行一些级联操作或者记录删除的日志信息。
触发器的实现方式:数据库管理系统支持不同的触发器实现方式,包括行级触发器和语句级触发器。
行级触发器:当每一行数据被影响时,行级触发器会被触发。
行级触发器对于需要单独处理表中每一行数据的操作很有用。
在行级触发器中,可以使用OLD和NEW关键字来引用被修改的旧数据和新数据。
语句级触发器:当影响到整个语句时,语句级触发器会被触发。
语句级触发器对于需要以批处理方式处理数据的操作很有用。
在语句级触发器中,不能使用OLD和NEW关键字,因为触发器对整个语句进行处理,而不是针对每一行数据。
触发器的设计与实现步骤:设计和实现一个触发器需要以下步骤:1. 定义触发器的名称和触发时机:确定触发器的名称和在何时触发。
数据库触发器的编写和应用实践数据库触发器是一种在特定事件发生时自动执行的数据库对象。
它可以监视数据库的各种操作,如插入、更新、删除等,并在满足特定条件时执行相应的动作。
本文将介绍数据库触发器的编写和应用实践。
一、数据库触发器的编写1. 定义触发器类型:数据库触发器包括三种类型:BEFORE、AFTER和INSTEAD OF。
BEFORE触发器在触发事件之前执行,并且可以修改新值或阻止触发事件的执行。
AFTER触发器在触发事件之后执行,并且不能修改新值。
INSTEAD OF触发器是在触发事件之前执行,但可以阻止触发事件的执行,并自行处理相关操作。
2. 定义触发器事件:数据库触发器可以与特定的表、视图或数据库事件相关联。
可以为表的INSERT、UPDATE和DELETE操作编写相应的触发器,或者与特定的视图或数据库事件相关联。
3. 编写触发器逻辑:触发器逻辑是在触发事件发生时要执行的操作。
它可以是SQL语句,也可以是自定义的存储过程或函数。
可以根据需要在触发器中执行各种数据库操作,如插入、更新、删除等。
4. 定义触发器的触发条件:触发器可以通过定义触发条件来确定在何时执行。
触发条件可以使用SQL语句中的条件表达式来定义,并可以包含对新值和旧值的引用。
5. 定义触发器的生命周期:数据库触发器可以定义其生命周期,即触发器何时启动和何时停止。
可以在CREATE TRIGGER语句中使用ON关键字来指定触发器的启动和停止时间。
二、数据库触发器的应用实践1. 数据一致性维护:数据库触发器可用于维护数据的一致性。
例如,可以编写触发器来验证插入或更新操作中的数据完整性。
触发器可以检查输入数据的条件,并根据规则拒绝或修改数据,确保数据的一致性。
2. 日志记录和审计:触发器还可以用于记录和审计数据库操作。
可以编写触发器来在特定事件发生时插入数据到日志表中。
这样可以跟踪数据库操作的历史记录并进行审计。
3. 查询优化:触发器可以用于查询优化,通过预先计算和缓存计算结果来提高查询性能。
数据库的触发器与数据导入导出的说明书引言:本文将详细介绍数据库中触发器的概念、作用以及使用方法,并对数据的导入和导出过程进行说明。
通过阅读本说明书,您将了解到如何合理运用触发器实现数据库操作的自动化,以及如何高效地进行数据的导入和导出。
一、数据库触发器的概念与作用数据库触发器是一种特殊的存储过程,它与数据库中的特定事件相关联,当这些事件发生时,触发器将被自动激活执行。
触发器可以用于捕获和响应数据库中的数据变化,以实现特定的业务需求。
1.1 概念触发器是由事件、触发时间、触发的对象和触发操作组成的。
事件可以是数据的插入、更新或删除操作,触发时间可以是事务之前、之后或事务中,触发的对象可以是表、视图或数据库,触发操作可以是SQL语句的执行、调用存储过程等。
1.2 作用触发器可以用于以下场景:- 数据完整性维护:通过在插入、更新或删除数据之前检查和修改数据,确保数据库中的数据的一致性和准确性。
- 数据变化监控:监控数据的变化并根据需要触发其他操作,如发送通知、生成日志等。
- 数据库操作自动化:通过在触发器中执行SQL语句或调用存储过程,实现一些自动化的数据库操作,如更新关联数据、计算统计指标等。
二、触发器的使用方法下面将介绍触发器的创建、修改和删除等操作方法。
2.1 创建触发器创建触发器需要指定触发器所针对的事件、触发时间、触发的对象以及触发操作等。
创建触发器的语法如下:```sqlCREATE TRIGGER trigger_name{BEFORE | AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE} ON table_name[FOR EACH ROW]BEGIN-- 触发器的触发操作END;```其中,trigger_name是触发器的名称,table_name是触发器所关联的表名。
2.2 修改触发器如果需要修改已经创建的触发器,可以使用ALTER TRIGGER语句进行修改。
触发器的定义及优点
触发器(Trigger)的定义
触发器是一种**特殊的存储过程**,它在插入、删除、修改特定表中的数据时,触发执行(由DBMS自动调用)。
它能提供比数据库本身标准功能更精细、更复杂的数据控制能力。
**可用于数据库的安全性控制和完整性检查**。
触发器的优点
触发器不依赖于任何客户端应用程序,也不依赖于访问数据库的语言。
触发器有如下优点:
1)标准化。
在整个应用上,触发器保证了数据的完整性和一致性,一旦在表上建立了触发器,它就存储在数据库中;这种方法消除了各个客户应用程序的冗余编码,便于规则发生变化时对编码进行修改;
2)高效率。
触发器初始执行后,作为编译的代码执行。
它的运行速度快,与在客户工作站上执行这些代码相比,在服务器上执行这些代码减少了网络通讯量和网络冲突;触发器把数据完整性代码放在服务器平台上比放在客户工作站上更有效;
3)安全性。
触发器运行要有表主人的授权,但是,触发器能够被在表中插入、删除、修改记录的任何一个用户触发。
任何一个应用程序或交互式子用户都无法避开触发器。
程序员应知应会之数据库中的触发器在信息技术发展的早期阶段,由于数据量不是很大,为维持数据完整性、维护一定数据标准的原因,因此开发了触发器技术。
但是随着信息技术的发展,信息系统日益成为人们生活中必需的一部分,因此,触发器技术也就随着技术的发展,逐渐脱离了主流的应用场景。
但是作为一种功能设计,触发器技术也是一名合格的程序员所需要了解的一部分。
今天我们就来看看数据库触发器的特点及应用。
一、触发器的概念触发器是与表有关的数据库对象,在满足预定义的条件时会被触发,从而执行触发器中定义的语句集合。
二、触发器什么时候会被触发在数据库进行数据变更的时候,触发器可以被触发。
即对数据表进行插入、删除、修改数据的时候,可以执行触发器。
触发器定义在表上,也依附于表存在。
触发器可以在数据表变更进行前执行,也可能在变更进行后执行。
触发器对于每一行都会被执行。
三、触发器的作用1、安全性:触发器能够基于数据库的值使用户具有操作数据库的权限,也可以基于时间等因素限制用户的操作,比如不在节假日修改数据,或者不允许股票一次涨跌超过10%。
2、审计功能:触发器能够跟踪用户对于数据库的每个操作,并且把用户对于数据的操作写入审计表。
对于某些重要,而且数据不会被大量操作的系统来讲,是一个非常有意义的功能。
3、数据完整性:可以实现数据库本身无法提供的,非标准的数据完整性检查和约束,触发器能够引用列或数据库对象。
或者提供基于其它字段的,可变的默认值。
四、MySQL中如何创建触发器MySQL从5.0.1版本开始提供触发器功能,MySQL中创建触发器的语句如下:创建单行执行语句的触发器:create trigger 触发器名 before|after 触发条件on 表名 for each row执行语句;创建多行执行语句的触发器:create trigger 触发器名 before|after 触发条件on 表名 for each rowbegin执行语句;end;在触发器中,有系统变量NEW和OLD,分别代表触发了触发器的那一行数据的旧值和新值。
MySQL数据库编程(三));insert into product(pname,price,pnum,totalsales)values('苹果',5,300,100),('香蕉',4,100,20),('梨子',2.5,120,20);二、按要求完成以下各题,在每道题目的下面粘贴好SQL语句及运行效果截图。
/*1、在订单表上创建触发器TR1,当订单成功插入时,会根据订单中的产品编号和数量自动修改产品表的商品库存数量和总销量。
*//*测试触发器TR1的调用,在orders表中插入两条订单记录后,查看product和orders表*/CREATE TRIGGER TR1AFTER INSERTON ordersFOR EACH ROWBEGINUPDATE product SET pnum = pnum - new.onum, Totalsales = Totalsales + new.onum WHERE pid = new.pid;END;INSERT INTO orders VALUE (null,1,'2021-02-01 00:00:00', 20);INSERT INTO orders VALUE (null,2,'2021-02-02 00:00:00', 10);参考测试结果如下:其中图一是插入数据前product和orders表中的数据。
图一测试前product和orders表图二测试后product和orders表/*2-1、定义一个显示商品和订单表的存储过程select_product_orders*/CREATE PROCEDURE select_product_orders()BEGINSELECT * FROM product;SELECT * FROM orders;END;/*2-2、定义一个触发器tr2,当更改商品product表中的商品号时,同时将orders表的商品号全部更新*/CREATE TRIGGER tr2AFTER UPDATEON productFOR EACH ROWBEGINIF new.pid != old.pid THENUPDATE orders SET pid = new.pid WHERE pid = OLD.pid;END IF;END;/*2-3、编写验证触发器tr2功能的存储过程proc9_1,要求在该存储过程中通过调用存储过程select_product_orders,显示更新之后的数据*//*测试将产品表中的产品号1修改为4。
*/CREATE PROCEDURE proc9_1(cur int, next int)BEGINUPDATE productSET pid = nextWHERE pid = cur;CALL select_product_orders();END;CALL proc9_1(1, 4);/*3、定义一个触发器tr3,每当在orders表中修改订单表的订购数量时,触发器自动将product表中该订单包含的商品库存数量和该商品的总销量更新*/CREATE TRIGGER tr3AFTER UPDATEON ordersFOR EACH ROWBEGINIF new.onum != old.onum THENUPDATE productSET pnum = pnum - (new.onum - OLD.onum),Totalsales = Totalsales + (new.onum - OLD.onum)WHERE pid = new.pid;END IF;END;/*编写对触发器tr3测试的语句*/以下是将订单表中订单号为1的订购数量更改为1之后商品表和订单表中的数据,由此可观察到该触发器调用后商品表中4号商品当年总销量和库存的变化。
图一:对触发器调用前product和orders表中的数据图二:对触发器调用后product和orders表中的数据/*4、结合第一题中的触发器,定义一个存储过程pro2完善订单插入业务的模拟,只有订购数量小于商品库存数量时,订单才插入成功,否则提示库存不够,业务模拟完毕后要求在该存储过程中调用select_product_orders 存储过程查看产品和订单的数据*/ CREATE PROCEDURE proc2(id int, time TIMESTAMP, num int)BEGINDECLARE cur_pnum int;SELECT pnum INTO cur_pnum FROM product WHERE pid = id;IF (num <= cur_pnum) THENINSERT INTO orders VALUES (NULL, id, time, num);ELSESELECT CONCAT(id, '商品库存不够');END IF;CALL select_product_orders();END;调用存储过程pro2,测试订购3号商品121个的数据。
测试之后商品表和订单表中的数据均未发生变化,结果将如下图所示:CALL proc2(3, '2021-02-02 00:00:00', 121);调用存储过程pro2,以下测试的是订购3号商品10件之后的数据(注意,此处我们需要先将触发器tr3和tr4删除),测试之后的数据将如下图所示:CALL proc2(3, '2021-04-19 00:00:00', 10);/*思考加分题:1、创建一个触发器,该触发器的功能是删除某项商品时,将该商品对应的订购记录均删除,并返回删除的记录数。
*/CREATE TRIGGER countOfDeletedByPidAFTER DELETEON productFOR EACH ROWBEGINDELETE FROM orders WHERE pid = OLD.pid;SELECT ROW_COUNT() INTO @cnt;END;/*测试数据的删除*/测试前product和orders表中的数据如下所示:以下是将产品表中产品号为2的商品删除后product和orders表中的数据:DELETEFROM productWHERE pid = 2;此次操作删除的记录数';SELECT @cnt '受影响的行数';/*2、综合运用存储过程和触发器模拟以下情形:当某商品进行促销时,后台限制了每日购买该商品的数量,综合运用存储过程和触发器对该情形进行模拟,假设限定每日每种商品的购买数量不超过40件来测试数据。
*/CREATE PROCEDURE promotion(IN id int, IN time timestamp, IN num int)BEGINDECLARE curDateSUM int DEFAULT 0;SELECT DATE_FORMAT(time, '%Y-%m-%d') INTO @ofTime;SELECT SUM(onum)INTO curDateSUMFROM ordersWHERE id = pid AND @ofTime = (SELECT DATE_FORMAT(ord_date, '%Y-%m-%d'));SELECT CONCAT('准备订购,订购前', id, '号商品', @ofTime, '日总销量为', curDateSUM) 订购前当日总销量;IF (curDateSUM + num <= 40) THENINSERT INTO orders VALUES (NULL, id, time, num);SELECT CONCAT('订购成功,订购后', id, '号商品', @ofTime, '日总销量为', curDateSUM + num) 订购后当日总销量;ELSESELECT CONCAT('订购失败!该商品超过每日购买限制');END IF;END;假设在存储过程和触发器调用之前,商品表和订单表的数据如下:INSERT INTO ordersVALUES (NULL, 1, '2021-02-01 00:00:00', 20);INSERT INTO ordersVALUES (NULL, 2, '2021-02-02 00:00:00', 10);INSERT INTO ordersVALUES (NULL, 2, '2021-02-02 15:20:20', 10);INSERT INTO ordersVALUES (NULL, 2, '2021-04-23 21:22:49', 10);INSERT INTO ordersVALUES (NULL, 1, '2021-04-23 21:22:49', 6);INSERT INTO ordersVALUES (NULL, 1, '2021-02-01 00:00:00', 20);INSERT INTO ordersVALUES (NULL, 2, '2021-02-02 00:00:00', 10);INSERT INTO product(pname, price, pnum, totalsales)VALUES ('苹果', 5, 300, 100),('香蕉', 4, 100, 20),('梨子', 2.5, 120, 20);当新增加一条订单记录,该记录是2021-02-02订购2号商品5件后。
将显示如下结果:CALL promotion(2, '2021-02-02 00:00:00', 5);同时订单表和商品表分别如下图所示:当再次新增加一条订单记录,该记录是2021-02-02订购2号商品6件后。
将显示如下结果:CALL promotion(2, '2021-02-02 00:00:00', 6);同时订单表和商品表的数据未发生变化,其结果分别如下图所示:实验总结:教师评语:。