- 浏览: 329504 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
hufangxian:
估计面试官都被你的回答搞晕了。
抽象类和接口的理解 -
alvin198761:
需要了解多态和设计模式,了解一些框架的原理,你就知道这东东真正 ...
抽象类和接口的理解 -
sangei:
谢谢楼上提醒,希望慢慢能有所进步。
抽象类和接口的理解 -
jackra:
书背的不错可以看看设计模式如何使用抽象类
抽象类和接口的理解 -
ptsd:
lag(column_x,number1,XX)用来返回当前数 ...
【转】oracle的LAG和LEAD分析函数
自治事务(autonomous transaction)允许你创建一个“事务中的事务),它能独立于其父事务提交 通过例子来说明。 创建一个简单的表来保存消息:create table t ( msg varchar2(25) ); 接下来创建两个过程,每个过程只是将其名字插入到消息表中,然后提交。不过,其中一个过程是正 create or replace procedure Autonomous_Insert as 使用pragma AUTONOMOUS_TRANSACTION。这个指令告诉数据库:执行这个过程时要作为一 create or replace procedure NonAutonomous_Insert as 下面来观察PL/SQL 代码匿名块中非自治(nonautonomous)事务的行为: begin select * from t; 可以看到,匿名块执行的工作(INSERT)由NONAUTONOMOUNS_INSERT 过程提交。两个数据行都已提交, delete from t; commit; begin select * from t; 在此,只有自治事务中完成并已提交的工作会持久保留。匿名块中完成的INSERT 由第4 行的回滚语 如果在一个“正常”的过程中COMMIT,它不仅会持久保留自己的工作,也会使该会话中 下面是一个小例子。先在表上放一个自治事务触发器,它能捕获一个审计跟踪记录,详细地指出谁 create table emp 要创建一个AUDIT_TAB 表,在这个表中存储审计信息。注意,我们使用了列的DEFAULT 属性,从而 create table audit_tab(username varchar2(30) default user, timestamp date default sysdate, msg varchar2(4000)); 创建一个EMP_AUDIT 触发器对EMP 表上的UPDATE 活动进行审计: create or replace trigger EMP_AUDIT select count(*) 注意,这里使用了CONNECT BY 查询。这会根据当前用户分析整个(员工)层次结构。它会验证我们 update emp set sal = sal*10; select * from audit_tab; 触发器发现了情况,能防止UPDATE 发生,而与此同时,会为这个企图创建一个永久记录(注意它在 update ops$tkyte.emp set sal = sal*1.05 where ename = 'ADAMS'; 在演示表EMP 的默认安装中,员工ADAMS 是SCOTT 的下属,所以第一个UPDATE 成功。再看第二个 select * from audit_tab;
或回滚。利用自治事务,可以挂起当前执行的事务,开始一个新事务,完成一些工作,然后提交或回滚,
所有这些都不影响当前执行事务的状态。自治事务提供了一种用PL/SQL 控制事务的新方法,可以用于:
顶层匿名块;
本地(过程中的过程)、独立或打包的函数和过程;
对象类型的方法;
数据库触发器。
常的过程,另一个编写为自治事务。我们将使用这些对象来显示在各种情况下哪些工作会在数据库中持久
保留(被提交)。
首先是AUTONOMOUS_INSERT 过程:
pragma autonomous_transaction;
begin
insert into t values ('Autonomous Insert');
commit;
end;
个新的自治事务来执行,而且独立于其父事务。
注意: pragma 是一个编译器指令,这是一种编辑器执行某种编译选项的方法。还有其他一些pragma。
以下是“正常”的NONAUTONOMOUS_INSERT 过程:
begin
insert into t values ('NonAutonomous Insert');
commit;
end;
insert into t values ('Anonymous Block');
NonAutonomous_Insert;
rollback;
end;
MSG
-------------------------
Anonymous Block
NonAutonomous Insert
所以ROLLBACK 命令没有什么可以回滚。把这个过程与自治事务过程的行为加以比较:
insert into t values ( 'Anonymous Block' );
Autonomous_Insert;
rollback;
end;
MSG
-------------------------
Autonomous Insert
句回滚。自治事务过程的COMMIT 对匿名块中开始的父事务没有影响。
未完成的工作成为永久性的。不过,如果在一个自治事务过程中完成COMMIT,只会让这个过程本身的工作
成为永久性的。
试图更新表,这个人什么时候想更新表,另外还会提供一个描述性消息指出这个人想要修改什么数据。这
个触发器的基本逻辑是:对于不向你直接或间接报告的员工,要防止更新这些员工记录的任何企图。
首先,从SCOTT 模式建立EMP 表的一个副本,以此作为本例使用的表:
as
select * from scott.emp;
默认具有当前登录的用户名以及登记审计跟踪信息的当前日期/时间:
before update on emp
for each row
declare
pragma autonomous_transaction;
l_cnt number;
begin
into l_cnt
from dual
where EXISTS
(select null
from emp
where empno = :new.empno
start with mgr = (select empno from emp where ename = USER)
connect by prior empno = mgr);
if (l_cnt = 0) then
insert into audit_tab
(msg)
values
('Attempt to update ' || :new.empno);
commit;
raise_application_error(-20001, 'Access Denied');
end if;
end;
试图更新的记录是某个下属员工的记录,即这个人会在某个层次上向我们报告。
关于这个触发器的要点,主要如下:
PRAGMA AUTONOMOUS_TRANSACTION 应用于触发器定义。整个触发器是一个“自治事务”,因
此它独立于父事务(即企图完成更新的事务)。
触发器在查询中从它保护的表(EMP 表) 中具体读取。如果这不是一个自治事务,它本身
在运行时就会导致一个变异表错误。自治事务使我们绕开了这个问题,它允许我们读取表,但
是也带来了一个缺点, 我们无法看到自己对表做的修改。在这种情况下需要特别小心,这个逻
辑必须仔细审查。如果我们完成的事务是对员工层次结构本身的一个更新会怎么样?我们不会
在触发器中看到这些修改,在评估触发器的正确性时也要把这考虑在内。
触发器提交。这在以前不可能的,触发器以前从来不能提交工作。这个触发器并不是提交
父事务的工作(实际触发器触发的工作,即更新员工记录),而只是提交了触发器所完成的工作
(审计记录)。
在此,我们建立了EMP 表,其中一个妥善的层次结构(EMPNO-MGR 递归关系)。另外还有一个AUDIT_TAB
表,要在其中记录修改信息的失败企图。我们的触发器可以保证这样一个规则:只有我们的经理或经理的
经理(依此类推)可以修改我们的记录。
update emp set sal = sal*10
*
ERROR at line 1:
ORA-20001: Access Denied
ORA-06512: at "OPS$TKYTE.EMP_AUDIT", line 21
ORA-04088: error during execution of trigger 'OPS$TKYTE.EMP_AUDIT'
USERNAME TIMESTAMP MSG
--------- --------- ----------------------------------------
OPS$TKYTE 27-APR-05 Attempt to update 7369
AUDIT_TAB 表的CREATE TABLE 语句上如何使用DEFAULT 关键字来自动插入USER 和SYSDATE 值)。接下来,
假设我们作为一个用户登录,想实际完成一个UPDATE,并做一些尝试:
1 row updated.update ops$tkyte.emp set sal = sal*1.05 where ename = 'SCOTT';
update ops$tkyte.emp set sal = sal*1.05 where ename = 'SCOTT'
*
ERROR at line 1:
ORA-20001: Access Denied
ORA-06512: at "OPS$TKYTE.EMP_AUDIT", line 21
ORA-04088: error during execution of trigger 'OPS$TKYTE.EMP_AUDIT'
UPDATE,SCOTT 试图给自己加薪,但是由于SCOTT 不向SCOTT 报告(SCOTT 不是自己的下属),所以这个更
新失败了。再登录回到包括AUDIT_TAB 表的模式,可以看到以下结果:
USERNAME TIMESTAMP MSG
--------- --------- -------------------------------------
---
OPS$TKYTE 27-APR-05 Attempt to update 7369
SCOTT 27-APR-05 Attempt to update 7788
发表评论
-
mysql之union
2015-11-12 17:04 625今天来写写union的用法及一些需要注意的。 unio ... -
(转)in 和 exist
2013-09-09 23:30 1201in 和 exists区别in 是把 ... -
(转)Oracle中的Join
2013-09-09 15:56 8311、概述 1.1、所有的join连接,都可以加上类似wh ... -
(转)数据库三范式
2013-07-10 11:52 818关系数据库设计范式介 ... -
oracle的分号和斜杠(转)
2012-10-17 10:51 5430引用 1. Adding a slash ... -
(转)oracle索引整理
2012-04-13 14:38 0一, oracle的索引陷阱一个表中有几百万条数据,对某个字 ... -
(转)Oracle中的Hash Join祥解
2012-04-13 01:28 1422一、 hash join概念 hash jo ... -
(转)oracle 表连接方式详解
2012-04-13 01:26 1185在查看sql执行计划时,我们会发现表的连接方式有多种,本文 ... -
(转)Oracle sql 优化2
2012-04-13 01:23 1211这里提供的是执行性能的优化,而不是后台数据库优化器资料: ... -
(转)Oracle sql 优化1
2012-04-12 22:27 1452ORACLE有个高速缓冲的概念,这个高速缓冲呢就是存放执 ... -
(转)join, inner join, left join, right join, full join的区别
2012-04-11 23:32 6021inner join可以简写为join 连接分为两种: ... -
(转)ORACLE 正斜杠(/)的作用
2012-03-22 23:32 2730正斜杠(/):在Oracle中,用来终止SQL语句。更准确的说 ... -
[转]oracle的复合索引两个知识点
2012-03-20 15:13 2375Oracle 9i以前的复合索引:如果索引有多个字段组成,索引 ... -
【转】oracle的LAG和LEAD分析函数
2012-03-19 17:19 5510Lag和Lead函数可以在一次查询中取出同一字段的前N ... -
[转]oracle临时表相关知识
2012-03-19 11:10 1264回复: 临时表存放在哪 ... -
Oracle中的rownum(伪列)用法解析
2012-03-19 10:44 1480注意:rownum从1开始; 1.rownum按照记录插入时的 ... -
Oracle 取整、四舍五入及格式化 Round/Floor/Ceil
2012-03-16 20:55 5435原文地址:http://kb.cnblogs.com/ ... -
Oracle秒变时间
2012-03-16 20:56 1160SQL:> select numtod ... -
Oracle时间加减单位时间
2012-03-07 21:00 1899加法 select sysdate,add_months(s ... -
(转)in和exists
2012-01-12 21:16 1132分析一下exists真的就比i ...
相关推荐
自治事务是与主事务相分离的,所以它不能检测到被修改过的行的当前状态。这就好像在主事务提交之前,它们一直处于单独的会话里,对自治事务来说,它们是不可用的。然而,反过来情况就不同了:主事务能够检测到已经...
简介事务与锁定的问题以及自治事务 并举例说明
Oracle自治事务的介绍(Autonomous_Transactions)PRAGMA_AUTONOMOUS_TRANSACTION
在触发器中使用自制事务及调用存储过程 Declare Pragma Autonomous_Transaction; ...
主要介绍了SQLServer存储过程中事务的使用方法,简短的代码带大家更好的学习使用SQLServer存储过程中事务,感兴趣的小伙伴们可以参考一下
spring-tx spring-transaction spring事务管理实例
9:数据装载 10:优化策略和工具 11:优化器方案稳定性 12:分析函数 13:物化试图 14:分区 15:自治事务 16:动态SQL 17:intermedia 18:基于C的外部过程 19:JAVA存储过程 20:使用对象关系特性 21:精细存取控制...
9:数据装载 10:优化策略和工具 11:优化器方案稳定性 12:分析函数 13:物化试图 14:分区 15:自治事务 16:动态SQL 17:intermedia 18:基于C的外部过程 19:JAVA存储过程 20:使用对象关系特性 21:精细存取控制...
新疆网络学法用法第八章新疆维吾尔自治区宗教事务条例练习答案.pdf
Seata:简单的可扩展自治事务架构,面向微服务架构的高性能和易用性的分布式事务解决方案。
Seata:简单的可扩展自治事务架构,面向微服务架构的高性能和易用性的分布式事务解决方案。
8.6.1 自治事务如何工作? 273 8.6.2 何时使用自治事务? 276 8.7 小结 279 第9章 redo与undo 281 9.1 什么是redo? 281 9.2 什么是undo? 282 9.3 redo和undo如何协作? 285 9.4 提交和回滚处理 289 9.4.1 ...
PLSQL个人总结最佳实践。
内蒙古自治区会计师事务所.pdf
[Q]怎么样设置自治事务 5 [Q]怎么样在过程中暂停指定时间 5 [Q]怎么样快速计算事务的时间与日志量 5 [Q]怎样创建临时表 6 [Q]怎么样在PL/SQL中执行DDL语句 6 [Q]怎么样获取IP地址 7 [Q]怎么样加密存储过程 7 [Q] 7 ...
对子程序的调用者权限、管道表函数、传递触发器标识:new和:old以及自治事务也给出了具体的解决方法。第8 章 LOB与面向对象的数据管理. 第9章 Oracle的监听器和网络设置。包括Oracle网络体系结构,Oracle Net参数文件...
对子程序的调用者权限、管道表函数、传递触发器标识:new和:old以及自治事务也给出了具体的解决方法。第8 章 LOB与面向对象的数据管理. 第9章 Oracle的监听器和网络设置。包括Oracle网络体系结构,Oracle Net参数文件...
CruiseYoung提供的带有详细书签的电子... 14.12 自治事务 409 14.13 小结 413 第15章 测试与质量保证 415 15.1 测试用例 416 15.2 测试方法 417 15.3 单元测试 418 15.4 回归测试 422 15.5 模式修改 422 15.6...