4--8--触发器-与锁剖析

上传人:今*** 文档编号:107232528 上传时间:2019-10-18 格式:PPT 页数:29 大小:743KB
返回 下载 相关 举报
4--8--触发器-与锁剖析_第1页
第1页 / 共29页
4--8--触发器-与锁剖析_第2页
第2页 / 共29页
4--8--触发器-与锁剖析_第3页
第3页 / 共29页
4--8--触发器-与锁剖析_第4页
第4页 / 共29页
4--8--触发器-与锁剖析_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《4--8--触发器-与锁剖析》由会员分享,可在线阅读,更多相关《4--8--触发器-与锁剖析(29页珍藏版)》请在金锄头文库上搜索。

1、pl/sql之触发器,oracle培训,触发器,触发器是当特定事件出现时自动执行的存储过程 特定事件可以是执行更新的DML语句和DDL语句 触发器不能被显式调用 触发器的功能: 自动生成数据 自定义复杂的安全权限 提供审计和日志记录 启用复杂的业务逻辑,创建触发器的语法,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 n

2、ew FOR EACH ROW WHEN (condition) pl/sql_block;,触发器的组成部分 3-1,触发器由三部分组成: 触发器语句(事件) 定义激活触发器的 DML 事件和 DDL 事件 触发器限制 执行触发器的条件,该条件必须为真才能激活触发器 触发器操作(主体) 包含一些 SQL 语句和代码,它们在发出了触发器语句且触发限制的值为真时运行,触发器的组成部分 3-2,SQL CREATE OR REPLACE TRIGGER trig_sal AFTER UPDATE OF empsal ON salary_records ,触发器语句,为 salary_records

3、 表创建 trig-sal 触发器,在更新 emp_sal 列之后激活触发器,触发器限制,SQL FOR EACH ROW WHEN (NEW.empsalOLD.empsal) DECLARE Sal_diff NUMBER; ,只有在WHEN子句中的条件得到满足时,才激活trig_sal 触发器,触发器操作,SQL BEGIN sal_diff:=:NEW.empsal-:OLD.empsal; DBMS_OUTPUT.PUT_LINE(工资差额:sal_diff); END;,如果WHEN子句中的条件得到满足,将执行BEGIN 块中的代码,触发器的组成部分 3-3,Oracle 数据库,

4、更新,表,保存更新,激活,触发器,AFTER 触发器的工作原理,BEFORE 触发器的工作原理,更新,表,激活,触发器,保存更新,Oracle 数据库,创建触发器,CREATE OR REPLACE TRIGGER aiu_itemfile AFTER INSERT ON itemfile FOR EACH ROW BEGIN IF (:NEW.qty_hand = 0) THEN DBMS_OUTPUT.PUT_LINE(警告:已插入记录,但数量为零); ELSE DBMS_OUTPUT.PUT_LINE(已插入记录); END IF; END; /,触发器类型 6-1,触发器的类型有:,触

5、发器类型,模式(DDL) 触发器,DML 触发器,数据库级 触发器,语句级触发器,行级触发器,INSTEAD OF触发器,触发器类型 6-2,DDL 触发器 数据库级触发器 DML 触发器 语句级触发器 行级触发器 INSTEAD OF 触发器,触发器类型 6-3,行级触发器,SQL CREATE TABLE TEST_TRG (ID NUMBER, NAME VARCHAR2(20); SQL CREATE SEQUENCE SEQ_TEST; SQL CREATE OR REPLACE TRIGGER BI_TEST_TRG BEFORE INSERT OR UPDATE OF ID ON

6、 TEST_TRG FOR EACH ROW BEGIN IF INSERTING THEN SELECT SEQ_TEST.NEXTVAL INTO :NEW.ID FROM DUAL; ELSE RAISE_APPLICATION_ERROR(-20020, 不允许更新ID值!); END IF; END; /,触发器类型 6-4,SQL CREATE OR REPLACE TRIGGER trgdemo AFTER INSERT OR UPDATE OR DELETE ON order_master BEGIN IF UPDATING THEN DBMS_OUTPUT.PUT_LINE(

7、已更新 ORDER_MASTER 中的数据); ELSIF DELETING THEN DBMS_OUTPUT.PUT_LINE(已删除 ORDER_MASTER 中的数据); ELSIF INSERTING THEN DBMS_OUTPUT.PUT_LINE(已在 ORDER_MASTER 中插入数据); END IF; END; /,语句级触发器,触发器类型 6-5,SQL CREATE OR REPLACE TRIGGER upd_ord_view INSTEAD OF UPDATE ON ord_view FOR EACH ROW BEGIN UPDATE order_master S

8、ET vencode=:NEW.vencode WHERE orderno = :NEW.orderno; DBMS_OUTPUT.PUT_LINE(已激活触发器); END; /,INSTEAD OF 触发器,触发器类型 6-6,SQL CREATE TABLE dropped_obj ( obj_name VARCHAR2(30), obj_type VARCHAR2(20), drop_date DATE); SQL CREATE OR REPLACE TRIGGER log_drop_obj AFTER DROP ON SCHEMA BEGIN INSERT INTO dropped_

9、obj VALUES( ORA_DICT_OBJ_NAME, ORA_DICT_OBJ_TYPE, SYSDATE); END; /,模式触发器,启用和禁用触发器,启用、禁用和删除触发器,SQL ALTER TRIGGER aiu_itemfile DISABLE;,SQL ALTER TRIGGER aiu_itemfile ENABLE;,SQL DROP TRIGGER aiu_itemfile;,删除触发器,查看有关触发器的信息,SQL SELECT TRIGGER_NAME FROM USER_TRIGGERS WHERE TABLE_NAME=EMP; SQL SELECT TRI

10、GGER_TYPE, TRIGGERING_EVENT, WHEN_CLAUSE FROM USER_TRIGGERS WHERE TRIGGER_NAME = BIU_EMP_DEPTNO;,USER_TRIGGERS 数据字典视图包含有关触发器的信息,锁,得到最大的性能和数据保护,一般数据库都有并发机制,带来的问题就是数据访问的冲突。为了解决这个问题,大多数数据库用的方法就是数据的锁定。 数据的锁定分为两种方法,第一种叫做悲观锁,第二种叫做乐观锁。什么叫悲观锁呢,悲观锁顾名思义,就是对数据的冲突采取一种悲观的态度,也就是说假设数据肯定会冲突,所以在数据开始读取的时候就把数据锁定住。 乐观锁

11、,就是一开始假设不会造成数据冲突,在最后提交的时候再进行数据冲突检测。 一般要结合程序来实现,锁的概念 2-1,锁是数据库用来控制共享资源并发访问的机制。 锁用于保护正在被修改的数据 直到提交或回滚了事务之后,其他用户才可以更新数据 释放锁,锁的概念 2-2,修改表,修改表,拒绝访问,锁定的优点,一致性 - 一次只允许一个用户修改数据 完整性 - 为所有用户提供正确的数据。如果一个用户进行了修改并保存,所做的修改将反映给所有用户,并行性 允许多个用户访问同一数据,修改表中 的数据,查看表中的数据,允许访问,表级锁,行级锁,锁的类型,锁的类型,行级锁 3-1,更新 T002 行,更新 T001

12、行,行被锁定,对正在被修改的行进行锁定。其他用户可以访问除被锁定的行以外的行,允许访问,行级锁 3-2,行级锁是一种排他锁,防止其他事务修改此行 在使用以下语句时,Oracle会自动应用行级锁: INSERT UPDATE DELETE SELECT FOR UPDATE SELECT FOR UPDATE语句允许用户一次锁定多条记录进行更新 使用COMMIT或ROLLBACK语句释放锁,行级锁 3-3,SELECT FOR UPDATE语法: SELECT FOR UPDATE OF columns WAIT n | NOWAIT;,SQL SELECT * FROM order_maste

13、r WHERE vencode=V002 FOR UPDATE OF odate, del_date; SQL UPDATE order_master SET del_date=28-8月-05 WHERE vencode=V002; SQL COMMIT;,SQL SELECT * FROM order_master WHERE vencode=V002 FOR UPDATE WAIT 5;,SQL SELECT * FROM order_master WHERE vencode=V002 FOR UPDATE NOWAIT;,表级锁 3-1,修改表中的行,更新表,拒绝访问,锁定整个表,限制

14、其他用户对表的访问。,表级锁 3-2,表级锁类型,行共享,行排他,共享,使用命令显示地锁定表,应用表级锁的语法是: LOCK TABLE table_name IN mode MODE;,共享行排他,排他,表级锁 3-3,行共享 (ROW SHARE) 禁止排他锁定表 行排他(ROW EXCLUSIVE) 禁止使用排他锁和共享锁 共享锁(SHARE) 锁定表,仅允许其他用户查询表中的行 禁止其他用户插入、更新和删除行 多个用户可以同时在同一个表上应用此锁 共享行排他(SHARE ROW EXCLUSIVE) 比共享锁更多的限制,禁止使用共享锁及更高的锁 排他(EXCLUSIVE) 限制最强的表

15、锁,仅允许其他用户查询该表的行。禁止修改和锁定表,乐观锁机制,更新前在应用中存储所要操作行的“前映像”,更新时使用存储的旧记录来判断当前值是否已经改变; 使用一个特殊的列,这个列由一个数据库触发器或应用程序代码维护,可以告诉我们记录的 “版本”; 表中额外增加版本列。 每次提交判断是否相同。不同认为冲突 使用一个校验和或散列值,这是使用原来的数据计算得出的; 使用新增的 Oracle 10g 特性 ORA_ROWSCN 。,死锁,当两个事务相互等待对方释放资源时,就会形成死锁 Oracle会自动检测死锁,并通过结束其中的一个事务来解决死锁 右边是一个死锁的例子,总结,触发器在特定的数据库事件发生的时候执行一个存储过程 用于行、表、数据库事件等,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号