Montag, Mai 22, 2006

Connect by level

zu Dokumentierungszwecken:

select rownum
  from dual
connect by level <= 10
/

    ROWNUM
----------
         1
         2
         3
         4
         5
         6
         7
         8
         9
        10

10 Zeilen ausgewählt.

Als Nummerngenerator verwendbar.

Mittwoch, Mai 17, 2006

Letzte Tabellenänderungen

Das Datum der letzten Strukturänderung findet man in user_objects, also z.B.:

select object_name
     , last_ddl_time
  from user_objects  
 where object_name = 'NAME_DER_TABELLE'    
   and object_type = 'TABLE';

Die letzte Änderung eines Datensatzes kann man sich in 10g mit Hilfe der Pseudocolumn ORA_ROWSCN anzeigen lassen. Diese Pseudocolumn liefert die SCN der letzten Änderung des Blocks, in dem sich der Datensatz befindet (theoretisch kann man auch die Änderung des Einzelsatzes berücksichtigen, aber dazu muss die Tabelle mit der Option <rowdependencies> erstellt worden sein). Diese SCN kann man sich über eine Funktion in einen Timestamp umwandeln lassen (was aber nur in einem bestimmten Zeitraum funktioniert, da das Mapping SCN - Timestamp offenbar nicht dauerhaft gespeichert wird):

select ora_rowscn
     , scn_to_timestamp(ora_rowscn)
  from NAME_DER_TABELLE;

Für Versionen vor 10g fällt mir keine so simple Methode ein, um Datensatzänderungen zu ermitteln. Da könnte man vielleicht mit Audit, dem Logminer oder gruseligen Triggern arbeiten, aber das alles wäre jedenfalls deutlich aufwändiger.

Nachtrag 04.05.2011: da dieser Eintrag offenbar relativ häufig aufgerufen wird, hier noch der Verweis auf Tanel Poders lastchanged.sql-Script, das noch ein paar Schritte über die hier gezeigten Möglichkeiten hinaus geht. Der Link zum download des Scripts auf der angesprochenen Seite scheint aktuell nicht zu funktionieren, aber möglicherweise nur temporär, da der Herr Poder schreibt: "I plan to fix the broken links some time between now and my retirement." In der Zwischenzeit empfiehlt er, die komplette Script-Sammlung zu laden - und das lohnt sich in diesem Fall ganz gewiß.