oracle 数据库伪列 ORA

tech2025-05-03  11

ORA_ROWSCN 可以用来记录表中每一行数据最后修改时的SCN号,当应用使用乐观锁时,可以使用这列来控制版本。

创建表时默认是 NOROWDEPENDENCIES,查询时显示的是该行所在的 block 上最后一次修改的SCN 创建表时设置为 ROWDEPENDENCIES 时,每一行都有自己的 SCN

需要注意的是ROWDEPENDENCIES属性只有在创建表时使用才有效,对于已有的表,通过alter table 语句是无效的,因此需通过重建表的方式来解决。

create table NOROWDEPENDENCIES

默认是 NOROWDEPENDENCIES

SQL> create table tmp_t100 ( id integer ); insert into tmp_t100 values(1); commit; insert into tmp_t100 values(2); commit;

可以看到 ORA_ROWSCN 是相同的。

SQL> select ora_rowscn,rowid,id from tmp_t100; ORA_ROWSCN ROWID ID ---------- ------------------ ---------- 102234285 AAB1TqAABAAArP5AAA 1 102234285 AAB1TqAABAAArP5AAB 2 SQL> update tmp_t100 set id=3 where id=2; commit; SQL> select ora_rowscn,rowid,id from tmp_t100; ORA_ROWSCN ROWID ID ---------- ------------------ ---------- 102234349 AAB1TqAABAAArP5AAA 1 102234349 AAB1TqAABAAArP5AAB 3

create table ROWDEPENDENCIES

SQL> create table tmp_t101 ( id integer ) rowdependencies; insert into tmp_t101 values(1); commit; insert into tmp_t101 values(2); commit; SQL> select ora_rowscn,rowid,id from tmp_t101; ORA_ROWSCN ROWID ID ---------- ------------------ ---------- 102234957 AAB1TrAABAAArWBAAA 1 102234959 AAB1TrAABAAArWBAAB 2

可以看到 ORA_ROWSCN 是不同的。

SQL> update tmp_t101 set id=3 where id=2; commit; SQL> select ora_rowscn,rowid,id from tmp_t101; ORA_ROWSCN ROWID ID ---------- ------------------ ---------- 102234957 AAB1TrAABAAArWBAAA 1 102234988 AAB1TrAABAAArWBAAB 3

参考: https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/ORA_ROWSCN-Pseudocolumn.html#GUID-8071AAB0-F656-4C93-B926-0BCE1439F121

最新回复(0)