简单的答案是“否”-但是使用NUMBER列和设置/更新它的触发器来创建自己很容易。
Oracle 11gR2的一个简单示例:
CREATE SEQUENCE global_rowversion_seq;ALTER TABLE mytable1 ADD rowversion NUMBER;ALTER TABLE mytable2 ADD rowversion NUMBER;CREATE TRIGGER mytable1_biu BEFORE INSERT OR UPDATe ON mytable1 FOR EACH ROWBEGIN :NEW.rowversion := global_rowversion_seq.NEXTVAL;END mytable1_biu;CREATE TRIGGER mytable2_biu BEFORE INSERT OR UPDATE ON mytable2 FOR EACH ROWBEGIN :NEW.rowversion := global_rowversion_seq.NEXTVAL;END mytable2_biu;
(如果您使用的是较早的Oracle版本,则触发器中的分配必须通过查询来完成,例如:
SELECT global_rowversion_seq.NEXTVAL INTO :NEW.rowversion FROM dual;
现在,请记住,在某些情况下,由于所有使用相同序列进行数据库插入/更新的争用,该设计在极端情况下(例如,具有极高插入/更新活动的数据库)可能会对性能产生影响。当然,在这种情况下,您可能首先会避免触发。
根据您使用rowversion列的方式,最好对每个表使用单独的序列。当然,这意味着行版本将不再是全局唯一的-
但是,如果您仅对比较表中行的更改感兴趣,那么就可以了。
另一种方法是分别为每一行增加计数器-这不需要序列,并且允许您检测到行的更改(但不允许将任何行与另一行进行比较):
ALTER TABLE mytable ADD rowversion NUMBER;CREATE TRIGGER mytable_biu BEFORE INSERT OR UPDATE ON mytable FOR EACH ROWBEGIN :NEW.rowversion := NVL(:OLD.rowversion, 0) + 1;END mytable_biu;
每行将以rowversion = 1插入,然后对该行的后续更新会将其递增为2、3,依此类推。



