数据库触发器和内置程序包
navicat premium 触发器语法

navicat premium 触发器语法【原创实用版】目录1.Navicat Premium 简介2.触发器的概念和作用3.Navicat Premium 中创建触发器的方法4.触发器的语法和注意事项5.示例:在 Navicat Premium 中创建一个触发器正文1.Navicat Premium 简介avicat Premium 是一款强大的数据库管理工具,它可以让您以单一程序同时连线到 MySQL、SQLite、Oracle 及 PostgreSQL 等数据库,方便管理不同类型的数据库。
2.触发器的概念和作用触发器是一种数据库对象,当在数据库中执行某些操作(如插入、更新或删除记录)时,会自动执行一些特定的操作。
触发器可以用于确保数据的完整性和一致性,也可以用于实现一些复杂的业务逻辑。
3.Navicat Premium 中创建触发器的方法在 Navicat Premium 中创建触发器,首先需要打开一个已有的模型,然后按照以下步骤进行操作:1) 在上方选项卡中找到“形状”,点击“形状”;2) 找到“新建触发器”并点击;3) 输入触发器的名称和选择触发器类型(before、after、before-insert、after-insert 等);4) 编写触发器的 SQL 语句;5) 点击“保存”。
4.触发器的语法和注意事项触发器的语法基本结构如下:```CREATE TRIGGER trigger_nametrigger_time trigger_eventON table_name FOR EACH ROWtrigger_body;```其中,trigger_name 为触发器名称,trigger_time 为触发时间(before 或 after),trigger_event 为触发事件(insert、update 或delete),table_name 为触发器所作用的表名,trigger_body 为触发器执行的操作。
SQL触发器实例讲解

SQL触发器实例讲解2008-11-27 16:16:45| 分类:PROCEDURE | 标签:|字号大中小订阅SQL触发器实例1定义:何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。
触发器是一个特殊的存储过程。
常见的触发器有三种:分别应用于Insert , Update , Delete 事件。
我为什么要使用触发器?比如,这么两个表:Create Table Student( --学生表StudentID int primary key, --学号....)Create Table BorrowRecord( --学生借书记录表BorrowRecord int identity(1,1), --流水号StudentID int , --学号BorrowDate datetime, --借出时间ReturnDAte Datetime, --归还时间...)用到的功能有:1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号);2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。
等等。
这时候可以用到触发器。
对于1,创建一个Update触发器:Create Trigger truStudentOn Student --在Student表中创建触发器for Update --为什么事件触发As --事件触发后所要做的事情if Update(StudentID)beginUpdate BorrowRecordSet StudentID=i.StudentIDWhere br.StudentID=d.StudentIDend理解触发器里面的两个临时的表:Deleted , Inserted 。
注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。
一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别是:虚拟表Inserted 虚拟表Deleted在表记录新增时存放新增的记录不存储记录修改时存放用来更新的新记录存放更新前的记录删除时不存储记录存放被删除的记录一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧的记录到Deleted表,然后删除Student记录并写入新纪录。
触发器TRIGGER

触发器1、创建触发器在数据库管理系统中,维护数据库中数据的完整性非常重要。
触发器是一种特殊类型的存储过程,与表格紧密相连。
当用户修改表中的数据时,触发器将自动运行。
触发器可以使用Transact-SQL语句进行复杂的逻辑处理。
它基于一个表创建,但是可以对多个表进行操作,因此常用于复杂的业务规则。
创建触发器通常有两种方法,一种是在企业管理器中手动创建,另一种是通过SQL Server语句中的CREATE TRIGGER语句来创建。
在创建触发器之前,应该注意一下问题:(1)CREATE TRIGGER语句必须是批处理中的第一条语句。
将该处理中随后的其他所有语句解释为CREATE TRIGGER语句定义的一部分。
(2)创建触发器的权限默认分配给表的所有者,且不能将该权限转给其他用户。
(3)触发器为数据库对象,其名称必须遵循标识符的命名规则。
(4)虽然触发器可以引用当前数据库以外的对象,但只能在当前数据库中创建触发器。
(5)虽然不能在临时表或系统表上创建触发器,但是触发器可以引用临时表。
不应引用系统表,而应使用信息框架构视图。
(6)在含有引用DELETE或UPDATE操作定义的外键的表中,不能定义INSTEAD OF和INSTEAD OF UPDATE触发器。
(7)虽然TRUNCATE TABLE语句类似于没有WHERE子句(用于删除行)的DELETE语句,但它并不会引发DELETE触发器,因为TRUNCATETABLE语句没有记录。
(8)WRITETEXT语句不会引发INSERT或UPDATE触发器。
创建触发器的语法如下:CREATE TRIGGER trigger_nameON{table|view}[WITH ENCRYPTION]{{{FOR|AFTER|INSTEAD OF}{[INSERT][,][UPDATE][,][DELETE]}[WITH APPEND][NOT FOR REPLICATION]AS[{IF UPDATE(column)[{AND|OR}UPDATE(column)][,…n]|IF(COLUMNS_UPDATED(){bitwise_operator}updated_bitmas k){comparison_operator}column_bitmask[...n]}]sql_statement[...n]}}参数说明如下:table|view:在其上执行触发器的表或试图,有时称为触发器或触发器试图。
简单使用触发器SQL触发器的使用及语法

简单使用触发器SQL触发器的使用及语法SQL触发器是一种特殊类型的存储过程,它是在数据库中一些特定的操作发生时自动执行的。
触发器可以用于在数据被插入、更新或删除时执行一系列的操作。
本文将详细介绍SQL触发器的使用和语法。
1.触发器的类型:SQL触发器可以分为三种类型:插入触发器(INSERT trigger)、更新触发器(UPDATE trigger)和删除触发器(DELETE trigger)。
根据业务需求选择相应的触发器类型。
2.创建触发器:创建触发器需要使用CREATETRIGGER语句。
语法如下:CREATE TRIGGER <trigger_name>{BEFORE,AFTER,INSTEADOF}{INSERT,UPDATE,DELETE}[ON <table_name>][FOREACHROW][WHEN (<condition>)]BEGIN--触发器执行的操作END;其中,trigger_name是触发器的名称;BEFORE / AFTER / INSTEAD OF表示触发器在所指定操作之前、之后或者代替进行;INSERT / UPDATE/ DELETE表示触发器响应的操作类型;table_name是触发器所绑定的表名;FOR EACH ROW表示该触发器对每一行数据都执行;condition是触发器的条件。
3.触发器执行的操作:在触发器的BEGIN和END之间,可以进行一系列的操作,如执行SQL 语句、调用存储过程等。
可以根据业务需求在触发器中编写逻辑代码来满足需求。
4.触发器的应用场景:-数据完整性:可以使用触发器在插入、更新或删除数据时进行一些验证,确保数据的完整性。
例如,在插入新用户之前,可以在触发器中检查用户的必填字段是否为空。
-数据同步:可以使用触发器在数据更新时自动更新其他相关表中的数据,确保数据的同步。
例如,在更新订单信息时,可以在触发器中更新库存表中的相应数据。
navicat premium 触发器语法

navicat premium 触发器语法摘要:1.Navicat Premium 触发器概述2.创建触发器的步骤3.触发器应用场景及示例4.注意事项正文:Navicat Premium 是一款强大的数据库管理工具,可以方便地管理和操作各种类型的数据库。
触发器是数据库中一种重要的对象,用于在特定事件发生时自动执行某些操作。
本文将介绍如何在Navicat Premium 中创建和使用触发器,以及一些常用的应用场景。
一、Navicat Premium 触发器概述触发器是一种数据库对象,它可以监控表或其他数据库对象的事件,并在特定事件发生时自动执行预先定义的操作。
在Navicat Premium 中,触发器可以用于实现数据的一致性、完整性检查以及复杂的业务逻辑。
触发器与存储过程、函数等一起,为数据库管理员和开发人员提供了强大的业务规则实现能力。
二、创建触发器的步骤1.打开Navicat Premium,点击“连接”并选择您正在使用的数据库。
2.在弹出的连接窗口中输入连接信息,点击“确定”建立连接。
3.右键点击连接名列表中的数据库,选择“打开连接”。
4.在左侧列出的事件中,找到“触发器”并双击打开。
5.在触发器列表中,点击“新建”按钮创建一个新的触发器。
6.填写触发器的基本信息,如名称、类型、表名等。
7.设置触发事件的类型,如INSERT、UPDATE、DELETE 等。
8.编写触发器要执行的操作,如更新其他表、插入数据等。
9.测试触发器,确保其功能正确无误。
10.点击“保存”按钮,完成触发器的创建。
三、触发器应用场景及示例1.数据一致性:当一个表的数据发生变化时,自动同步更新另一个表的数据。
例如,当员工表中的信息发生变化时,触发器可以自动更新部门表中的相应信息。
2.数据完整性:在插入或更新数据时,触发器可以执行一些检查,确保数据的准确性。
例如,在用户表中插入数据时,触发器可以检查用户年龄是否大于等于18岁。
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 语句。
mysql触发器写法
mysql触发器写法MySQL触发器是一种在指定的表上自动执行的数据库对象。
它能够在特定的操作(insert、update、delete)发生时,自动触发相应的动作。
本文将介绍MySQL触发器的写法,并提供参考内容。
MySQL触发器的写法如下:```CREATE TRIGGER trigger_nameAFTER/BEFORE INSERT/UPDATE/DELETE ON table_name FOR EACH ROWBEGIN-- 触发器动作END;```触发器包含以下几个关键部分:1. 触发器名称(trigger_name):触发器的名称,用于区分不同的触发器。
2. 触发时间(AFTER/BEFORE):指定触发器在所指定的操作(INSERT/UPDATE/DELETE)之前或之后执行。
3. 触发事件表(table_name):指定触发器所属的表。
4. 触发条件(FOR EACH ROW):触发器执行的条件,常用于指定仅对受影响的行执行触发器。
5. 触发器动作(BEGIN...END):触发器要执行的操作,在BEGIN和END之间编写具体的SQL语句。
下面是一个示例,演示了如何创建一个在插入数据之后自动更新指定表的修改时间的触发器:```CREATE TRIGGER update_modified_timeAFTER INSERT ON my_tableFOR EACH ROWBEGINUPDATE my_table SET modified_time = NOW() WHERE id = NEW.id;END;```在这个例子中,`update_modified_time`是触发器的名称,`AFTER INSERT`表示在进行插入操作之后触发,`my_table`是要触发器所属的表,`FOR EACH ROW`表示对每一行都执行触发器动作。
在BEGIN和END之间的SQL语句将更新`my_table`表中指定行的`modified_time`字段。
触发器基本语法
触发器基本语法触发器是一种在特定条件下自动执行某种操作的数据库对象。
它是数据库管理系统中非常有用的功能,可以实现许多复杂的业务逻辑。
触发器主要由事件、条件和动作组成。
本文将详细介绍触发器的基本语法,并提供一些使用触发器的指导意义。
首先,触发器的事件指的是触发触发器执行的数据库操作。
常见的事件有插入(INSERT)、更新(UPDATE)和删除(DELETE)。
在定义触发器时,我们需要指定触发器所关联的表以及触发的事件。
例如,如果我们希望在某个表的插入操作触发触发器,可以使用如下语法:CREATE TRIGGER 触发器名称ON 表名FOR INSERT接着,触发器的条件用于确定是否要执行触发器的动作。
条件通常基于表中的数据,并使用一些条件表达式进行判断。
例如,我们可以使用IF语句来定义触发器的条件。
以下是一个使用条件的触发器语法示例:CREATE TRIGGER 触发器名称ON 表名FOR INSERTASIF 条件表达式BEGIN--触发器动作END最后,触发器的动作是在满足条件时执行的语句或语句块。
触发器的动作可以是任何合法的T-SQL语句,比如插入、更新或删除数据。
例如,以下是一个触发器的动作语法示例:CREATE TRIGGER 触发器名称ON 表名FOR INSERTASIF 条件表达式BEGIN--触发器动作INSERT INTO 其他表名 (列1, 列2, 列3)VALUES (值1, 值2, 值3)END触发器可以帮助我们实现许多复杂的业务逻辑。
例如,我们可以使用触发器来自动计算某个字段的值,或者在数据变化时记录日志。
触发器还可以用于实现数据一致性约束,例如,当删除某个表中的数据时,可以使用触发器来阻止删除操作,从而保证数据的完整性。
在使用触发器时,我们需要注意一些事项。
首先,触发器的执行是自动的,无法手动调用。
其次,触发器会在主动操作之前或之后触发,具体取决于我们定义触发器时的设置。
DB2开发系列之四——触发器
DB2开发系列之四——触发器1、触发器类型1)BEFORE 触发器:在对表插⼊或更新之前执⾏该触发器,允许使⽤CALL和SIGNAL SQL 语句;2)BEFORE DELETE 触发器:在删除操作之前执⾏该触发器;3)AFTER 触发器:在更新、插⼊或删除操作之后执⾏。
该触发器⽤于更新反映表间关系和⼀致性的其他表中的数据,还⽤于确保数据完整性。
AFTER 触发器通常⽤于在特定情况下向⽤户⽣成报警;4)INSTEAD OF 触发器:该触发器⽀持对不⽀持插⼊、更新和删除操作的视图执⾏这些操作;2、创建触发器所需的权限1)使⽤触发器的模式ID必须拥有以下权限之⼀:i)对定义 BEFORE 或 AFTER 触发器的表拥有 ALTER 权限;ii)对定义 INSTEAD OF 触发器的视图拥有 CONTROL 权限;iiI)对定义 INSTEAD OF 触发器的视图拥有所有权;iv)对定义触发器的表或视图的模式拥有 ALTERIN 权限;v)SYSADM 或 DBADM 授权;2)以及以下任意⼀种权限:i)IMPLICIT_SCHEMA 数据库授权(如果触发器的隐式或显式模式名称不存在);ii)对模式的 CREATEIN 权限(如果触发器的模式名称引⽤现有的模式);3)假定授权 ID 没有 SYSADM 和 DBADM 权限并且触发器存在,此 ID 必须拥有以下所有权限:i)对定义触发器的表拥有 SELECT 权限 — ⽤于转换变量和/或表;ii)对在触发的操作条件中引⽤的任意表或视图的 SELECT 权限;iii)调⽤触发的指定 SQL 语句所需的权限;3、创建触发器语句1)语法.-NO CASCADE-.>>-CREATE TRIGGER--trigger-name--+-+------------+--BEFORE-+----->+-AFTER------------------+'-INSTEAD OF-------------'>--+-INSERT--------------------------+--ON--+-table-name-+------>+-DELETE--------------------------+ '-view-name--''-UPDATE--+---------------------+-'| .-,-----------. || V | |'-OF----column-name-+-'>--+------------------------------------------------------------------+-->| .-------------------------------------------------. || V (1) (2) .-AS-. | |'-REFERENCING------------------+-OLD--+----+--correlation-name-+-+-'| .-AS-. |+-NEW--+----+--correlation-name-+| .-AS-. |+-OLD TABLE--+----+--identifier-+| .-AS-. |'-NEW TABLE--+----+--identifier-'>--+-FOR EACH ROW--------------+--| triggered-action |--------->| (3) |'--------FOR EACH STATEMENT-'triggered-action|--+-------------------------------------+---------------------->| (4) |'--------WHEN--(--search-condition--)-'2)触发器有三个主要组件:i)触发器事件;ii)触发器条件;iii)触发器操作;3)⽰例:i)简单的 AFTER INSERT 触发器CREATE TRIGGER new_empAFTER INSERT ON employeeREFERENCING NEW AS nFOR EACH ROWINSERT INTO audit_emp VALUES (n.empno, 'Insert',0.0, current user, current timestamp)ii)简单的 AFTER DELETE 触发器CREATE TRIGGER purge_empAFTER DELETE ON employeeREFERENCING OLD AS oFOR EACH ROWINSERT INTO audit_emp VALUES (o.empno, 'Delete',0.0, current user, current timestamp)iii)简单的 AFTER UPDATE 触发器CREATE TRIGGER update_empAFTER UPDATE OF salary ON employeeREFERENCING OLD AS o NEW AS nFOR EACH ROWWHEN (n.salary <> o.salry)INSERT INTO audit_emp VALUES (o.empno,'Update',n.salary,current user, current timestamp) iv)简单的 BEFORE UPDATE 触发器CREATE TRIGGER update_bempBEFORE UPDATE ON employeeREFERENCING OLD AS o NEW AS nFOR EACH ROWWHEN (n.salary = 60000.00)SET n.salary = 75000.00)4、触发器的⾼级⽤法1)INSTEAD OF 触发器--⽰例CREATE TABLE "DB2INST1"."EMPLOYEES"("EMPNO" CHAR(6) NOT NULL ,"FIRSTNME" VARCHAR(12) NOT NULL ,"LASTNAME" VARCHAR(15) NOT NULL ,"PHONENO" CHAR(4) ,"SALARY" DECIMAL(9,2))CREATE VIEW employeev ASSELECT empno, firstnme, lastname, phonenoFROM employeesCREATE TRIGGER new_emp1INSTEAD OF INSERT ON employeevREFERENCING NEW AS nFOR EACH ROWINSERT INTO employees VALUES (n.empno, n.firstnme, stname, n.phoneno, 0)2)⽤触发器处理 XML 数据--⽰例CREATE TRIGGER new_orderBEFORE INSERT ON purchaseorderREFERENCING NEW AS NFOR EACH ROWSET (n.porder) = xmlvalidate(n.porderACCORDING TOXMLSCHEMA URI '/order.xsd')3)使⽤ SQL PL 语句扩展触发器主体i)语法General Syntax Diagram for CREATE TRIGGER cont.SQL-procedure-statement|--+-CALL----------------------------------------------+--------|+-Compound SQL (Dynamic)----------------------------++-FOR-----------------------------------------------++-+-----------------------------------+--fullselect-+| | .-,-----------------------. | || | V | | || '-WITH----common-table-expression-+-' |+-GET DIAGNOSTICS-----------------------------------++-IF------------------------------------------------++-INSERT--------------------------------------------++-ITERATE-------------------------------------------++-LEAVE---------------------------------------------++-MERGE---------------------------------------------++-searched-delete-----------------------------------++-searched-update-----------------------------------++-SET Variable--------------------------------------++-SIGNAL--------------------------------------------+'-WHILE---------------------------------------------'ii)从触发器中调⽤存储过程CREATE PROCEDURE write_audit( IN p_empno CHAR(6),IN p_txt CHAR(6),IN p_salary DECIMAL(9,2),IN p_user CHAR(8),IN p_curtime TIMESTAMP )BEGININSERT INTO audit_emp VALUES ( p_empno, p_txt, p_salary, p_user, p_curtime ) ENDCREATE TRIGGER new_empAFTER INSERT ON employeeREFERENCING NEW AS nFOR EACH ROWCALL write_audit( n.empno, 'Insert', 0.0, current user, current timestamp)iii)使⽤ SQL PL 的 BEFORE INSERT 触发器CREATE TRIGGER business_rulesBEFORE INSERT ON empprojactREFERENCING NEW AS nFOR EACH ROWBEGIN ATOMIC-- Business Rule One (Project ending date Can't be NULL)IF (n.emendate IS NULL) THENSET n.emendate = CURRENT date;END IF;-- Business Rule Two (Project ending date Can't end in last month of the year)IF (n.emendate BETWEEN '2009-12-01' AND '2009-12-31') THENSIGNAL SQLSTATE '90000'SET MESSAGE_TEXT = 'Business Rule violation - 90000';END IF;END。
sql触发器写法
sql触发器写法SQL触发器是一种特殊的存储过程,它会在指定的数据库表上执行特定的操作时自动执行。
以下是触发器的基本写法:创建一个触发器,指定触发器名称和触发事件类型(INSERT、UPDATE或DELETE),以及触发器所关联的表名。
例如:sqlCREATE TRIGGER trigger_nameAFTER INSERT ON table_nameFOR EACH ROWBEGIN-- 触发器执行的语句END;在上面的示例中,trigger_name是触发器的名称,AFTER INSERT ON table_name指定了触发器在向指定表插入数据后执行,FOR EACH ROW表示触发器针对每一行数据执行一次。
在触发器内部编写要执行的语句。
这些语句可以是任何合法的SQL语句,例如插入、更新或删除数据,或者调用其他存储过程等。
例如:sqlCREATE TRIGGER trigger_nameAFTER INSERT ON table_nameFOR EACH ROWBEGININSERT INTO another_table (column1, column2) VALUES (NEW.column1, NEW.column2);END;在上面的示例中,触发器会在向table_name表中插入数据后,将新插入的数据的column1和column2字段的值插入到另一个表another_table中。
需要注意的是,触发器是一种强大的数据库对象,可以执行复杂的操作和逻辑。
但是,如果不正确地使用触发器,可能会导致数据库性能问题、数据不一致性等问题。
因此,在使用触发器时应该谨慎考虑其影响,并确保对其进行适当的测试和维护。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
9
视图:
CREATE OR REPLACE VIEW CLASSES_ROOMS AS SELECT r.department, r.building,c.room_id FROM rooms r, class c WHERE r.room_id = c.room_id
CREATE or replace TRIGGER ClassesRoomsInsert INSTEAD OF INSERT ON classes_rooms DECLARE v_roomID rooms.room_id%TYPE; BEGIN
12
创建触发器的通用语法:
13
create table TEMP_TABLE ( NUM_COL NUMBER, CHAR_COL VARCHAR2(100) ) CREATE SEQUENCE trig_seq START WITH 1 INCREMENT BY 1; CREATE OR REPLACE PACKAGE TrigPackage AS
22
数据库触发器10-6
• DML 触发器组件
– – – – – – 触发器定时 触发器事件 表名 触发器类型 WHEN 子句 触发器主体
23
数据库触发器10-7
• 变异表
– 当前正由 DML 语句修改 – 声明删除级联(引用完整性约束条件)的影 响
15
• • • • • • • • • • •
CREATE OR REPLACE TRIGGER ClassesBRow1 BEFORE UPDATE ON class FOR EACH ROW BEGIN INSERT INTO temp_table (num_col, char_col) VALUES (trig_seq.NEXTVAL, 'Before Row 1: counter = ' || TrigPackage.v_Counter); -- Increment for the next trigger. TrigPackage.v_Counter := TrigPackage.v_Counter + 1; END ClassesBRow1; CREATE OR REPLACE TRIGGER ClassesBRow2 BEFORE UPDATE ON class FOR EACH ROW BEGIN INSERT INTO temp_table (num_col, char_col) VALUES (trig_seq.NEXTVAL, 'Before Row 2: counter = ' || TrigPackage.v_Counter); -- Increment for the next trigger. TrigPackage.v_Counter := TrigPackage.v_Counter + 1; END ClassesBRow2;
-- First determine the room ID
SELECT room_id INTO v_roomID FROM rooms WHERE building = :new.building AND room_id = :new.room_id; UPDATE CLASSES SET room_id = v_roomID WHERE department = :new.department AND course = :new.course; 10END ClassesRoomsInsert;
3
触发器可以用于下列情况:
• 维护在表创建阶段通过声明限制无法实现的复杂 完整性限制。 • 通过记录修改内容和修改者来审计表中的信息。 • 在表内容发生变更时,自动通知其他程序采取相 应的处理。 • 在订阅发布环境下,发布有关各种事件的信息。
4
数据库触发器
• 数据库触发器
– – – – 是 PL/SQL 块或存储过程 是在对关联表执行 DML 操作时触发的 是隐式执行的 还可能具有声明部分和异常处理部分
• 触发器主体
– 是 PL/SQL 块或对过程的调用
• 触发器限制
– 可以通过 WHEN 子句实现
20
数据库触发器10-4
• 触发器的类型
– 应用程序触发器 – 数据库触发器
21
数据库触发器10-5
• 应用程序触发器
– 在应用程序内发生特定 DML 事件时,将隐式 触发它
• 数据库触发器
– 在表、视图或数据库上发生特定 DML 事件时, 将隐式触发它 – 在表和视图上定义 – 在数据库或方案上,它也可以充当系统 触发器
-- And now update the class
系统触发器
Oracle8 i提供了第三种触发器,这种系统触发器在发 生如数据库启动或关闭等系统事件时激发,而不是在执行 D M L语句时激发。系统触发器也可以在D D L操作时,如 表的创建中激发。例如,假设我们要记录对象创建的时间, 我们可以通过创建下面的表来实现 上述记录功能:
6
例子2/2
• • • • • • • • • • • • • • • •
DML触发
CREATE OR REPLACE TRIGGER UpdateMajorStats AFTER INSERT OR DELETE OR UPDATE ON students DECLARE CURSOR c_Statistics IS SELECT major, COUNT(*) total_students, SUM(current_credits) total_credits FROM students GROUP BY major; BEGIN DELETE FROM major_stats; FOR v_StatsRecord in c_Statistics LOOP INSERT INTO major_stats (major, total_credits, total_students) VALUES (v_StatsRecord.major, v_StatsRecord.total_credits, v_StatsRecord.total_students); END LOOP; END UpdateMajorStats;
数据库触发器
讲师:林强
目标
• 本章将讨论:
– 数据库触发器 – 内置程序包
2
简介
触发器类似于函数和过程,它们都是具有声明部分、执行 部分和异常处理部分的命名PL/SQL块。像包一样,触发器 必须在数据库中以独立对象的身份存储,并且不能与包和 块具有本地关系。我们在前两章中已经讲过,过程是显式 地通过过程调用从其他块中执行的,同时,过程调用可以 传递参数。与之相反,触发器是在事件发生时隐式地运行 的,并且触发器不能接收参数。运行触发器的方式叫做激 发(firing)触发器,触发事件可以是对数据库表的DML (INSERT、UPDATE或DELETE)操作或某种视图的操作( Vi e w )。Oracle8i把触发器功能扩展到了可以激发系统事件, 如数据库的启动和关闭,以及某种DDL操作。
v_Counter NUMBER; END TrigPackage;
-- Global counter for use in the triggers
14
• CREATE OR REPLACE TRIGGER ClassesBStatement BEFORE UPDATE ON class BEGIN
17
语句触发器
• 无FOR EACH ROW 语法; • 不可以用WHEN语法; • 不可以用new.column_name、 old.column_name语法;
18
数据库触发器10-2
• 触发器的组成部分
– 触发器语句 – 触发器主体 – 触发器限制
19
数据库触发器10-3
• 触发器语句
– 指定触发器定时、事件、表名及类型
5
例子2/1 DML触发
create table STUDENTS( ID INTEGER not null, MAJOR VARCHAR2(30), CURRENT_CREDITS NUMBER,) CREATE TABLE major_stats ( major VARCHAR2(30), total_credits NUMBER, total_students NUMBER); 为了保持表major_stats中的数据处于更新状态,创建一 个每次表students被修改时自动更新表major_stats的触 发器。
-- Reset the counter first.
• • • • • • • • •
TrigPackage.v_Counter := 0; INSERT INTO temp_table (num_col, char_col) VALUES (trig_seq.NEXTVAL, 'Before Statement: counter = ' || TrigPackage.v_Counter); TrigPackage.v_Counter := TrigPackage.v_Counter + 1; END ClassesBStatement; CREATE OR REPLACE TRIGGER ClassesAStatement1 AFTER UPDATE ON class BEGIN INSERT INTO temp_table (num_col, char_col) VALUES (trig_seq.NEXTVAL, 'After Statement 1: counter = ' || TrigPackage.v_Counter); -- Increment for the next trigger. TrigPackage.v_Counter := TrigPackage.v_Counter + 1; END ClassesAStatement1;