a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 274|回复: 1

[考试辅导] oracle认证应用技术学习资料汇总9

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
讲解Oracle数据库10g新特性中的闪回查询
/ R* c3 u9 Z% f" n$ {不需要设置,立即识别对行的所有更改  
" z! P, E! ?4 v4 I: \. B; u: R, E在 Oracle9i Database 中,我们看到它推出了以闪回查询形式表示的“时间机器”。该特性允许 DBA 看到特定时间的列值,只要在还原段中提供该数据块此前镜像的拷贝即可。但是,闪回查询只提供某时刻数据的固定快照,而不是在两个时间点之间被更改数据的运行状态表示。某些应用程序,如涉及到外币管理的应用程序,可能需要了解一段时期内数值数据的变化,而不仅仅是两个时间点的数值。由于闪回版本查询特性,Oracle Database 10g 能够更方便高效地执行该任务。  
; Q  p+ @1 j  \1 @8 W  9 W/ w$ j% J" h9 Q/ j! }8 U( K
  查询对表的更改  0 a0 a7 Q& q' K0 G0 w  i* f
在本示例中,我使用了一个银行外币管理应用程序。其数据库含有一个名称为 RATES 的表,用于记录特定时间的汇率。  
1 @7 F$ h" Y9 a. a2 |  # o- A! d, N0 b% H! n. x6 n
  SQL> desc rates  1 v) l  z5 {" ^: ]2 Z0 R  ^, h
  Name       Null?Type  
! J* V3 C; Y7 ?+ i# \6 z/ L   ----------------- -------- ------------  9 V6 Q: G; T: h. |* C
  CURRENCY          VARCHAR2(4)  
/ b7 h7 A" ?5 e9 d2 B  RATE            NUMBER(15,10) < ( f1 e( p) |5 |+ E- L" h* v1 b
该表显示 US$ 与各种其他货币的汇率,在 CURRENCY 列中显示。在金融服务行业中,汇率不但在变更时进行更新,而且被记录在历史中。需要这种方式的原因是银行交易可能在“过去时间”生效,以便适应由于汇款而耗费的时间。例如,对于一项在上午 10:12 发生但在上午 9:12 生效的交易,其有效汇率是上午 9:12 的汇率,而不是现在的汇率。  
* L$ i" E& W1 q5 J/ o( s( |  . [% }' F. v( M
直到现在,唯一的选择是创建一个汇率历史表来存储汇率的变更,然后查询该表是否提供历史记录。另一种选择是在 RATES 表本身中记录特定汇率适用性的开始和结束时间。当发生变更时,现有行中的 END_TIME 列被更新为 SYSDATE,并插入一个具有新汇率的新行,其 END_TIME 为 NULL。  # p' R- f: b$ M5 e$ N
  
- P- j+ B  |( U3 m. s; F但是在 Oracle Database 10g 中,闪回版本查询特性不需要维护历史表或存储开始和结束时间。使用该特性,您不必进行额外的设置,即可获得某行在过去特定时间的值。  
. ^4 H5 K4 |) V+ H  Z  
$ _! z% x0 m8 N: c/ J  例如,假定该 DBA 在正常业务过程中数次更新汇率 — 甚至删除了某行并重新插入该行:  ; b4 _) V' Q3 Q+ \  Y' e
  insert into rates values (’EURO’,1.1012);  
9 U( j8 j% T( _% O( \* x8 h  commit;  , m$ j, P# }0 A( v! {' }8 _" A+ J
  update rates set rate = 1.1014;  
( H- _2 e4 y+ ]; E9 O% o' x  commit;  
7 \% Q: p% D' V1 f7 r, o  update rates set rate = 1.1013;  ; t$ m" X$ e: q8 M
  commit;  9 d+ J* I1 C4 E1 k) j- _( T
  delete rates;  
9 M, L9 M2 o" l7 B  commit;  3 q. V' j1 \1 o3 Y" j
  insert into rates values (’EURO’,1.1016);  5 A2 ?+ m/ M, q3 f: Q/ Q
  commit;  
' G+ l2 Z! g0 Q; l; D  update rates set rate = 1.1011;  . e/ }6 B$ c4 N3 ?; v
  commit;  3 |, p+ W; _; d/ }; R! I
  在进行了这一系列操作后,DBA 将通过以下命令获得 RATE 列的当前提交值:  0 c7 \! _8 Z3 @1 L
  SQL> select * from rates;  ; c. Q8 h' t/ C! q4 G3 P
  CURR    RATE  
1 \5 H1 L7 B4 A7 J  D* z/ @  ---- ----------  9 b+ F2 O: B- B' `$ Y' w
EURO   1.1011 <
8 ^- R3 i+ t1 m  
+ D/ b6 J$ q( g; o此输出显示 RATE 的当前值,没有显示从第一次创建该行以来发生的所有变更。这时使用闪回查询,您可以找出给定时间点的值;但我们对构建变更的审计线索更感兴趣 — 有些类似于通过便携式摄像机来记录变更,而不只是在特定点拍摄一系列快照。  ( o' c, j2 n' J, a! Q6 y: s4 R
  以下查询显示了对表所做的更改:  , @% A. v  }8 l6 p+ a0 L4 g1 \% w
  select versions_starttime, versions_endtime, versions_xid,  
+ u8 f: \% r# |5 j; h  versions_operation, rate  
4 p% }' O* `6 {  from rates versions between timestamp minvalue and maxvalue  
0 ?. Q' r0 ^. r+ ?. R, X0 O  order by VERSIONS_STARTTIME  
4 @8 u2 T5 Q3 \3 i0 S  /  
' v; }, c( b' Y+ h  VERSIONS_STARTTIME   VERSIONS_ENDTIME    VERSIONS_XID   V    RATE  
1 o' L. V: W7 S1 b" X/ ^+ ]9 D1 G  ---------------------- ---------------------- ---------------- - ----------  
, D7 i/ }; c/ }  01-DEC-03 03.57.12 PM 01-DEC-03 03.57.30 PM 0002002800000C61 I   1.1012  
  \$ t* r; N* }8 F4 L  01-DEC-03 03.57.30 PM 01-DEC-03 03.57.39 PM 000A000A00000029 U   1.1014  6 Z0 U3 }1 c/ z6 l' t1 {& ^1 H; X
  01-DEC-03 03.57.39 PM 01-DEC-03 03.57.55 PM 000A000B00000029 U   1.1013  ) [; J4 Z4 N- V! K: w6 `7 Y
  01-DEC-03 03.57.55 PM             000A000C00000029 D   1.1013  3 X" z& g6 `8 L7 W4 O
  01-DEC-03 03.58.07 PM 01-DEC-03 03.58.17 PM 000A000D00000029 I   1.1016  
6 H& |: g, |9 S4 u01-DEC-03 03.58.17 PM             000A000E00000029 U   1.1011  
) m. B" e. M! L: @  
! \4 k! z2 h9 C- a注意,此处显示了对该行所作的所有更改,甚至包括该行被删除和重新插入的情况。VERSION_OPERATION 列显示对该行执行了什么操作 (Insert/Update/Delete)。所做的这些工作不需要历史表或额外的列。
回复

使用道具 举报

 楼主| 发表于 2012-8-4 14:06:20 | 显示全部楼层

oracle认证应用技术学习资料汇总9

  在上述查询中,列 versions_starttime、versions_endtime、versions_xid、versions_operation 是伪列,与 ROWNUM、LEVEL 等其他熟悉的伪列相类似。其他伪列 — 如 VERSIONS_STARTSCN 和 VERSIONS_ENDSCN — 显示了该时刻的系统更改号。列 versions_xid 显示了更改该行的事务标识符。有关该事务的更多详细信息可在视图 FLASHBACK_TRANSACTION_QUERY 中找到,其中列 XID 显示事务 id。例如,使用上述的 VERSIONS_XID 值 000A000D00000029,UNDO_SQL 值显示了实际的语句。  ( B& R- c) }8 R3 k
  SELECT UNDO_SQL  
( H% c+ X7 @7 ?, W& u' d' F  FROM FLASHBACK_TRANSACTION_QUERY  0 T- W6 _  N% |) B
  WHERE XID = ’000A000D00000029’;  6 G9 y( p. [' {" ^0 c
  UNDO_SQL  . k  u9 E; a8 u
  --------------------------------------------------  
  S9 O5 G- C+ W* X; E  insert into "ANANDA"."RATES"("CURRENCY","RATE")  
( q/ T1 Y( w& B/ n+ L% s' }6 rvalues (’EURO’,’1.1013’); <
; Z% I* j8 ?7 }  
2 ]2 e( |; r1 ~( {0 o/ B  除了实际语句之外,该视图还显示提交操作的时间标记和 SCN、查询开始时的 SCN 和时间标记以及其他信息。  2 l+ ^3 f0 H% f* }& r( y! V
  找出一段时期中的变更  
: }% @5 s# q, q$ {3 V7 N3 D$ z  现在,让我们来看如何有效地使用这些信息。假设我们需要找出下午 3:57:54 时 RATE 列的值。我们可以执行:  
9 L5 n0 f1 N/ u/ v  select rate, versions_starttime, versions_endtime  
% h8 S% {) v* ]& J4 h3 x  N. I6 ]  from rates versions  9 L- Z( Y) [7 B! \6 G1 X: I6 O
  between timestamp  ) K/ G. r. f. B/ n$ J( |. Y
  to_date(’12/1/2003 15:57:54’,’mm/dd/yyyy hh24:mi:ss’)  
% Y8 d" n0 K( ~4 y' ^0 G3 Y. U  and to_date(’12/1/2003 16:57:55’,’mm/dd/yyyy hh24:mi:ss’)  # S! z( c* m- T7 B
  /  7 w0 i* v; x! @- {" [9 C! d" Y
  RATE VERSIONS_STARTTIME   VERSIONS_ENDTIME  * k  P" e( [) V- E% P1 C) u7 F
  ---------- ---------------------- ----------------------  
# P! z! n) P0 V5 q, C  j    1.1011 <
$ C( O7 `0 p8 q  
1 T/ T+ U1 T5 U  w3 |% b7 L* ^8 ]# k此查询与闪回查询类似。在以上的示例中,开始和结束时间为空,表示汇率在该时间段中没有更改,而是包含一个时间段。还可以使用 SCN 来找出过去的版本值。可以从伪列 VERSIONS_STARTSCN 和 VERSIONS_ENDSCN 中获得 SCN 号。以下是一个示例:  / U+ k. `* a( h- N& W, G$ k( Z# f3 S
  select rate, versions_starttime, versions_endtime  
! N( f% r- p8 \  from rates versions  
4 P/ H9 e" a/ |" T& ^  between scn 1000 and 1001  
: u- h& F1 U4 y; i# x/ < / K: Q7 J: Q8 R; L" U6 X
  ) X) K9 l, O- N6 A' _/ G/ m% M
使用关键词 MINVALUE 和 MAXVALUE,可以显示还原段中提供的所有变更。您甚至可以提供一个特定的日期或 SCN 值作为范围的一个端点,而另一个端点是文字 MAXVALUE 或 MINVALUE。例如,以下查询提供那些只从下午 3:57:52 开始的变更,而不是全部范围的变更:  
; v# O; {& x; G8 E  ! x7 b" \% c- T! ]
  select versions_starttime, versions_endtime, versions_xid,  " V9 j% X3 \, W/ ^( g
  versions_operation, rate  
; n$ K$ Q& t* T/ b# s8 ~5 Y  from rates versions between timestamp  
& f8 K2 V+ @, U: r7 @$ N8 E2 ]  to_date(’12/11/2003 15:57:52’, ’mm/dd/yyyy hh24:mi:ss’)  
* P% |/ e" r5 q1 }! y  and maxvalue  
2 u3 U, h( l- h. `: G; b* b" ^% c9 \  G0 H  order by VERSIONS_STARTTIME  8 I$ O! Q3 p" y& m
  /  
9 K6 W5 B7 C% I. Q( k. d. v  VERSIONS_STARTTIME   VERSIONS_ENDTIME    VERSIONS_XID   V    RATE  0 r  N" Z% u( j: s# \, Z% p
  ---------------------- ---------------------- ---------------- - ----------  0 S: |9 O5 A8 @3 u3 X! @
  01-DEC-03 03.57.55 PM             000A000C00000029 D   1.1013  4 L( R( l0 `5 F+ s% Y# [8 g  k; b
  01-DEC-03 03.58.07 PM 01-DEC-03 03.58.17 PM 000A000D00000029 I   1.1016  : f% x& w0 r# K  ]# }* ]
01-DEC-03 03.58.17 PM             000A000E00000029 U   1.1011 <
! r  ~+ g" \& |* M& o7 d  
' N$ B  m9 X6 j  最终的分析  
. k! o3 m# {8 k  X& O  闪回版本查询随取随用地复制表变更的短期易变数值审计。这一优点使得 DBA 能够获得过去时间段中的所有变更而不是特定值,只要还原段中提供数据,就可以尽情使用。因此,最大的可用版本依赖于 UNDO_RETENTION 参数。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-5 05:58 , Processed in 0.159769 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表