Seiten

Montag, 7. Januar 2013

ORA_ROWSCN - Datensatzänderungen ermitteln

In einer von mir administrierten DB wird durch eine Web-Anwendung umfangreich Gebrauch von der Pseudospalte ORA_ROWSCN gemacht.
Diese Spalte gibt die SCN der letzten Änderung aus.
In der Anwendung soll über die ORA_ROWSCN ermittelt werden, ob ein bestimmter Datensatz seit dem letzten Zugriff geändert wurde.
Hierbei ist aber zu beachten, dass standardmäßig die SCN der letzten Änderung des Blocks ausgegeben wird. Da in einem Block für gewöhnlich mehrere Datensätze gespeichert sind, gehören zu einer ORA_ROWSCN also auch mehr als 1 Datensatz.
Das Ganze ist demnach erstmal recht unscharf.
Will man die ORA_ROWSCN datensatzscharf haben, muss die betroffene Tabelle korrekt angelegt werden:
CREATE TABLE test
   (col1 number, col2 varchar2(10), 
   constraint test_pk primary key(col1))
   ROWDEPENDENCIES;

Über ALTER TABLE lässt sich eine Tabelle leider nicht "datensatzscharf" schalten.

Natürlich lässt sich über die SCN auch der Zeitpunkt der Änderung ermitteln.

Quellen:
Oracle: http://docs.oracle.com/cd/E11882_01/server.112/e26088/pseudocolumns007.htm#SQLRF50953
AskTom: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:517105100346104196

Kommentare:

  1. Hallo,

    als kleine Ergänzung noch der Hinweis, dass man die ORA_ROWSCN mit Hilfe der Funktion scn_to_timestamp in einen Timestamp umwandeln kann - jedenfalls für SCNs, die nicht allzu weit in der Vergangenheit liegen. Für ältere SCNs liefert v$log_history einen Zeitrange und Tanel Poder hat gelegentlich ein Script veröffentlicht, das man zur kombinierten Abfrage der beiden Informationen verwenden kann: http://blog.tanelpoder.com/2009/02/07/when-was-a-table-last-changed/.

    Gruß

    Martin Preiss

    AntwortenLöschen
  2. Danke für den Tip. Habe mir das Script von Tanel Poder eben mal angesehen.
    Was mich noch interessieren würde: Wie alt darf eine SCN sein, damit SCN_TO_TIMESTAMP noch Werte liefert. Habe auf die Schnelle im Netz nichts gefunden. Wahrscheinlich hängen die zeitlichen Beschränkungen mit UNDO und Flashback zusammen.

    AntwortenLöschen
  3. Darüber hatte ich bisher nie ernsthaft nachgedacht, aber bei http://psoug.org/reference/pseudocols.html liest man: "The mapping of SCN to times is kept in bitmaps in sys.smon_scn_time - this table normally has about 1440 rows (more or less are possible) representing 5 minute windows of time over 5 days - 5 days of uptime (so you you start your database for 1 hour every day and shutdown for the other 23 - you'll have 5*24 days of history in this table)."

    Die nächste Frage wäre dann, was hier "normally" bedeutet ...

    AntwortenLöschen
    Antworten
    1. :) Danke. Aber die "normally"-Frage werde ich nicht stellen.

      MfG
      Marco

      Löschen