《数据库》第十五章 触发器
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
15
Inspur Education
触发器类型 8-7
DML中的伪记录
• 在行级别触发的触发器可以使用相关名称访问正在处理的行中 的数据。
• 常用的相关名称默认为OLD和NEW • OLD和NEW也称为伪记录(pseudorecord),因为它们具有记录
结构。伪记录的结构是table_name%ROWTYPE
11
ห้องสมุดไป่ตู้
Inspur Education
触发器类型 8-3
DML行级触发器
SQL> create table t_temp(f_id number,f_name varchar2(20)); SQL> create sequence seq_tempid; SQL> create trigger trig_temp before insert or update of f_id on t_temp for each row begin
/
17
Inspur Education
启用、禁用和删除触发器
启用和禁用触发器
SQL> ALTER TRIGGER trig_stu DISABLE; SQL> ALTER TRIGGER trig_stu ENABLE;
删除触发器
SQL> DROP TRIGGER trig_stu;
18
Inspur Education
特定事件可以是执行更新的DML语句和DDL语句 触发器不能被显式调用 触发器的功能:
自动生成数据 自定义复杂的安全权限 提供审计和日志记录 启用复杂的业务逻辑
4
Inspur Education
创建触发器的语法
CREATE [OR REPLACE] TRIGGER trigger_name AFTER | BEFORE | INSTEAD OF [INSERT] [[OR] UPDATE [OF column_list]] [[OR] DELETE] ON table_or_view_name [REFERENCING {OLD [AS] old / NEW [AS] new}] [FOR EACH ROW] [WHEN (condition)] pl/sql_block;
5
Inspur Education
触发器的组成部分 3-1
触发器由三部分组成: 触发器语句(事件)
定义激活触发器的 DML 事件和 DDL 事件
触发器限制
执行触发器的条件,该条件必须为真才能激活触发 器
触发器操作(主体)
包含一些 SQL 语句和代码,它们在发出了触发器 语句且触发限制的值为真时运行
:NEW.f_class := 1; END; /
9
Inspur Education
触发器类型 8-1
触发器的类型有:
触发器类型
INSTEAD OF 触发器
系统 触发器
DML 触发器
10
Inspur Education
触发器类型 8-2
DML触发器 如果在表或视图上创建触发器,并且触发事件由DML语句组成,这种触
6
Inspur Education
触发器的组成部分 3-2
触发器语限操句制作
SSQQLL>> SQL>
C…A……FWDS…BEsDROFaENEHalBTEGCDR_lE_EMAdL;INdENiTRAfSifAfER(f_UNN:C=OEOPUEH:UNRDMWRTEABR.POsWTEEaUEW.RlPsT>Oa;L.OPlAF-LU:CODsTEaL._slDTLaO.IRlsN)NaIEGle;(Gm‘工Ep资R 差trig额_s:a’l sal_diff);
14
Inspur Education
触发器类型 8-6
DML中的INSTEAD OF 触发器
SQL> CREATE OR REPLACE TRIGGER upd_ord_view INSTEAD OF UPDATE ON ord_view FOR EACH ROW BEGIN UPDATE order_master SET vencode=:NEW.vencode WHERE orderno = :NEW.orderno; DBMS_OUTPUT.PUT_LINE(‘已激活触发器'); END; /
Inspur Education
第15章 触发器
Inspur Education
知识点回顾
了解和使用子程序 存储过程 函数
了解和使用程序包
2
Inspur Education
本章目标
触发器的概念 触发器类型及创建方法 理解和应用触发器
3
Inspur Education
触发器
触发器是当特定事件出现时自动执行的存储过 程
触发器类型 8-4
DML语句级触发器
SQL> create or replace trigger trig_stu after insert or delete or update on t_student begin
if inserting then dbms_output.put_line('已添加t_student中的数据');
elsif deleting then dbms_output.put_line('已删除t_student中的数据');
elsif updating then dbms_output.put_line('已更新t_student中的数据');
end if; end; /
13
Inspur Education
在如足更果,新W将只件sH执有aE得l行在N为列tt到rrB子iiWgg之Ee满__句HmGs后s足Eaa中pIN激lNl时表触触的子块活,创发发条句中触才建器器件中的发激得的代器活到条码满
7
Inspur Education
触发器的组成部分 3-3
ABEFTFEORRE触触发发器器的的工工作作原原理理
触发器类型 8-5
DML触发器中的条件谓词
• DML触发器的触发事件可以由多个触发语句组成。 当其中任一个触发语句触发触发器时,触发器可以 通过使用这些条件谓词来确定哪一个。
条件谓词 INSERTING UPDATING UPDATING ('column') DELETING
触发语句 INSERT语句 UPDATE语句 UPDATE指定列的语句 DELETE语句
if inserting then select seq_tempid.nextval into :New.f_id from dual;
else Raise_Application_Error(-20020,'不允许更新ID值!');
end if; end; /
12
Inspur Education
查看有关触发器的信息
USER_TRIGGERS 数据字典视图包含有关触发器 的信息
SQL> SELECT TRIGGER_NAME FROM USER_TRIGGERS WHERE TABLE_NAME=‘t_student'; SQL> SELECT TRIGGER_TYPE, TRIGGERING_EVENT, WHEN_CLAUSE FROM USER_TRIGGERS WHERE TRIGGER_NAME = ‘trig_tempid';
发器称为DML触发器。 系统触发器
如果在方案或数据库上创建触发器,则触发事件由DDL或数据库操作语 句组成,触发器称为系统触发器。 INSTEAD OF触发器 (1)在非编辑视图上创建的DML触发器。 (2)在CREATE语句上定义的系统触发器,数据库触发INSTEAD OF触发器 而不是运行触发语句。
更新
Oracle
表
激保活存更新 触发器
数据库
激活 保存更新
触发器
Oracle 数据库
8
Inspur Education
创建触发器
CREATE OR REPLACE TRIGGER trig_stu BEFORE UPDATE OF f_class ON martin.t_student FOR EACH ROW WHEN (OLD.f_class=1) BEGIN
SQL> create or replace trigger trig_dropobj after drop on schema begin insert into t_droppedobj values (Ora_Dict_Obj_Name,Ora_Dict_Obj_Type,Sysdate); end;
19
Inspur Education
本章目标
触发器的概念 触发器类型及创建方法 理解和应用触发器
20
Inspur Education
谢谢!
21
触发语句
OLD.field值
NEW.field值
INSERT
NULL
插入后的值
UPDATE
更新前的值
更新后的值
DELETE
删除前的值
NULL
16
Inspur Education
触发器类型 8-8
系统触发器中的schema触发器
SQL> create table t_droppedobj ( f_objname varchar2(20), f_objtype varchar2(20), f_dropdate date );
Inspur Education
触发器类型 8-7
DML中的伪记录
• 在行级别触发的触发器可以使用相关名称访问正在处理的行中 的数据。
• 常用的相关名称默认为OLD和NEW • OLD和NEW也称为伪记录(pseudorecord),因为它们具有记录
结构。伪记录的结构是table_name%ROWTYPE
11
ห้องสมุดไป่ตู้
Inspur Education
触发器类型 8-3
DML行级触发器
SQL> create table t_temp(f_id number,f_name varchar2(20)); SQL> create sequence seq_tempid; SQL> create trigger trig_temp before insert or update of f_id on t_temp for each row begin
/
17
Inspur Education
启用、禁用和删除触发器
启用和禁用触发器
SQL> ALTER TRIGGER trig_stu DISABLE; SQL> ALTER TRIGGER trig_stu ENABLE;
删除触发器
SQL> DROP TRIGGER trig_stu;
18
Inspur Education
特定事件可以是执行更新的DML语句和DDL语句 触发器不能被显式调用 触发器的功能:
自动生成数据 自定义复杂的安全权限 提供审计和日志记录 启用复杂的业务逻辑
4
Inspur Education
创建触发器的语法
CREATE [OR REPLACE] TRIGGER trigger_name AFTER | BEFORE | INSTEAD OF [INSERT] [[OR] UPDATE [OF column_list]] [[OR] DELETE] ON table_or_view_name [REFERENCING {OLD [AS] old / NEW [AS] new}] [FOR EACH ROW] [WHEN (condition)] pl/sql_block;
5
Inspur Education
触发器的组成部分 3-1
触发器由三部分组成: 触发器语句(事件)
定义激活触发器的 DML 事件和 DDL 事件
触发器限制
执行触发器的条件,该条件必须为真才能激活触发 器
触发器操作(主体)
包含一些 SQL 语句和代码,它们在发出了触发器 语句且触发限制的值为真时运行
:NEW.f_class := 1; END; /
9
Inspur Education
触发器类型 8-1
触发器的类型有:
触发器类型
INSTEAD OF 触发器
系统 触发器
DML 触发器
10
Inspur Education
触发器类型 8-2
DML触发器 如果在表或视图上创建触发器,并且触发事件由DML语句组成,这种触
6
Inspur Education
触发器的组成部分 3-2
触发器语限操句制作
SSQQLL>> SQL>
C…A……FWDS…BEsDROFaENEHalBTEGCDR_lE_EMAdL;INdENiTRAfSifAfER(f_UNN:C=OEOPUEH:UNRDMWRTEABR.POsWTEEaUEW.RlPsT>Oa;L.OPlAF-LU:CODsTEaL._slDTLaO.IRlsN)NaIEGle;(Gm‘工Ep资R 差trig额_s:a’l sal_diff);
14
Inspur Education
触发器类型 8-6
DML中的INSTEAD OF 触发器
SQL> CREATE OR REPLACE TRIGGER upd_ord_view INSTEAD OF UPDATE ON ord_view FOR EACH ROW BEGIN UPDATE order_master SET vencode=:NEW.vencode WHERE orderno = :NEW.orderno; DBMS_OUTPUT.PUT_LINE(‘已激活触发器'); END; /
Inspur Education
第15章 触发器
Inspur Education
知识点回顾
了解和使用子程序 存储过程 函数
了解和使用程序包
2
Inspur Education
本章目标
触发器的概念 触发器类型及创建方法 理解和应用触发器
3
Inspur Education
触发器
触发器是当特定事件出现时自动执行的存储过 程
触发器类型 8-4
DML语句级触发器
SQL> create or replace trigger trig_stu after insert or delete or update on t_student begin
if inserting then dbms_output.put_line('已添加t_student中的数据');
elsif deleting then dbms_output.put_line('已删除t_student中的数据');
elsif updating then dbms_output.put_line('已更新t_student中的数据');
end if; end; /
13
Inspur Education
在如足更果,新W将只件sH执有aE得l行在N为列tt到rrB子iiWgg之Ee满__句HmGs后s足Eaa中pIN激lNl时表触触的子块活,创发发条句中触才建器器件中的发激得的代器活到条码满
7
Inspur Education
触发器的组成部分 3-3
ABEFTFEORRE触触发发器器的的工工作作原原理理
触发器类型 8-5
DML触发器中的条件谓词
• DML触发器的触发事件可以由多个触发语句组成。 当其中任一个触发语句触发触发器时,触发器可以 通过使用这些条件谓词来确定哪一个。
条件谓词 INSERTING UPDATING UPDATING ('column') DELETING
触发语句 INSERT语句 UPDATE语句 UPDATE指定列的语句 DELETE语句
if inserting then select seq_tempid.nextval into :New.f_id from dual;
else Raise_Application_Error(-20020,'不允许更新ID值!');
end if; end; /
12
Inspur Education
查看有关触发器的信息
USER_TRIGGERS 数据字典视图包含有关触发器 的信息
SQL> SELECT TRIGGER_NAME FROM USER_TRIGGERS WHERE TABLE_NAME=‘t_student'; SQL> SELECT TRIGGER_TYPE, TRIGGERING_EVENT, WHEN_CLAUSE FROM USER_TRIGGERS WHERE TRIGGER_NAME = ‘trig_tempid';
发器称为DML触发器。 系统触发器
如果在方案或数据库上创建触发器,则触发事件由DDL或数据库操作语 句组成,触发器称为系统触发器。 INSTEAD OF触发器 (1)在非编辑视图上创建的DML触发器。 (2)在CREATE语句上定义的系统触发器,数据库触发INSTEAD OF触发器 而不是运行触发语句。
更新
Oracle
表
激保活存更新 触发器
数据库
激活 保存更新
触发器
Oracle 数据库
8
Inspur Education
创建触发器
CREATE OR REPLACE TRIGGER trig_stu BEFORE UPDATE OF f_class ON martin.t_student FOR EACH ROW WHEN (OLD.f_class=1) BEGIN
SQL> create or replace trigger trig_dropobj after drop on schema begin insert into t_droppedobj values (Ora_Dict_Obj_Name,Ora_Dict_Obj_Type,Sysdate); end;
19
Inspur Education
本章目标
触发器的概念 触发器类型及创建方法 理解和应用触发器
20
Inspur Education
谢谢!
21
触发语句
OLD.field值
NEW.field值
INSERT
NULL
插入后的值
UPDATE
更新前的值
更新后的值
DELETE
删除前的值
NULL
16
Inspur Education
触发器类型 8-8
系统触发器中的schema触发器
SQL> create table t_droppedobj ( f_objname varchar2(20), f_objtype varchar2(20), f_dropdate date );