Oracle中的ORA_ROWSCN函数的作用是什么

0    226    2

Tags:

👉 本文共约3117个字,系统预计阅读时间或需12分钟。

简介

对于每一行数据,ORA_ROWSCN可以返回每一行最近被修改的大概时间,可用于查询表最后一次被执行DML操作的时间。是每个表自带的一个伪列。

由于Oracle通过事务提交对行所在数据块来进行SCN(System Change Number,系统改变号,一个由系统内部维护的序列号。当系统需要更新的时候自动增加,它是系统中维持数据的一致性和顺序恢复的重要标志)的跟踪,即该块上有任何一行进行了修改,该块的ora_rowscn都发生变化,而且一个块的ora_rowscn是相同的。所以,它不精确。可以通过在创建表时使用行级别的依赖跟踪(ROWDEPENDENCIES)来获得一个更加精确的SCN。

在对视图进行查询时,不能使用ORA_ROWSCN函数,但对于视图的基表是可以使用ORA_ROWSCN函数的,也能在UPDATE或DELETE语句的WHERE子句中使用ORA_ROWSCN函数。

ORA_ROWSCN虽然不能用于闪回查询,但是可以用闪回版本查询来代替ORA_ROWSCN。

ORA_ROWSCN也不能用于外部表。

示例1

基于块级别

对表做dml操作

a. 创建测试表,查询原始数据,ora_rowscn为3089371

b. 修改一行数据,ora_rowscn变成3089858

c. 删除一行数据,ora_rowscn变成3089961

d. 插入一行数据,老块(BLOCK_ID 315)的ora_rowscn仍然是3089961,新插入的行(BLOCK_ID 319)ora_rowscn是3090014

​ e. 再插入一行数据,老块(BLOCK_ID 315)的ora_rowscn不变,新插入的行(BLOCK_ID 319)ora_rowscn变成3090087

可以看到ora_rowscn记录的是块级别的改动,即该块上有任何一行进行了修改,该块的ora_rowscn都发生变化,而且一个块的ora_rowscn是相同的。

对表做ddl操作

a. 新增一列,ora_rowscn没有发生变化

b. 删除一列,所有的ora_rowscn全部发生变化

​ 可以看到新增一列,ora_rowscn并没有发生变化,删除一列,ora_rowscn发生了变化。这是因为新增一列只是修改了表的定义,对表的行没有影响,而删除一列,会同步修改表的行,所以ora_rowscn会发生变化。

查看scn对应的时间

使用scn_to_timestamp可以将scn转换成时间

​ 但是并不是所有的scn都可以使用scn_to_timestamp函数,下面的scn就报错

这是因为数据库会自动清理旧的scn,scn_to_timestamp函数能够转换成时间的最小scn记录在表smon_scn_time中,只有大于等于这个最小值才能使用scn_to_timestamp函数

基于行级别

建一张rowdependencies的表

修改一行数据,可以看到仅仅被修改的行的ORA_ROWSCN发生了变化

可以看到rowdependencies的表是细颗粒的,ora_rowscn精确到每一行,而创建表默认是norowdependencies,只精确到块。

示例2

ORA_ROWSCN函数的使用示例如下所示,

基于块级别

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信dbaup66,谢谢!
AiDBA后续精彩内容已被站长无情隐藏,请输入验证码解锁本文!
验证码:
获取验证码: 请先关注本站微信公众号,然后回复“验证码”,获取验证码。在微信里搜索“AiDBA”或者“dbaup6”或者微信扫描右侧二维码都可以关注本站微信公众号。

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复