Announcement

Collapse
No announcement yet.

Erstellungsdatum einer Datei ändern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Erstellungsdatum einer Datei ändern

    Wir speichern aus unserer Datenbank regelmäßig automatisiert alle DDL-Anweisungen in einzelne Dateien. Dabei wäre es optimal, wenn die Datei des Datenbank-Objekts jeweils als Erstellungsdatum das Kompilierungsdatum (LAST_DDL_DATE oder so ähnlich) des Objekts hätte.
    Ist so etwas überhaupt möglich?

  • #2
    Suchst du dieses hier:
    [highlight=sql]select created, last_ddl_time from all_objects where object_name = ...[/highlight]

    Wenn das nicht aussreicht gibt es noch die Möglichkeit mit einem DDL-Trigger
    [highlight=sql]create or replace trigger
    DDLTrigger
    AFTER DDL ON DATABASE
    BEGIN
    insert into ... values (systimestamp)...
    END;
    /[/highlight]



    Gruss

    Comment


    • #3
      damit bekomme ich das DDL-Datum, soweit war ich bereits. Aber wie kann ich die zugehörige Datei entsprechend manipulieren?

      CURSOR curData IS
      SELECT object_type, object_name FROM all_objects WHERE owner LIKE pSchemaname AND object_type<>'LOB' AND last_ddl_time > trunc(sysdate-7);

      BEGIN

      FOR cur_rec IN curData LOOP
      vObj := replace(cur_rec.object_type, ' ', '_');
      if vObj='PACKAGE' then
      vObj := 'PACKAGE_SPEC';
      else if vObj='JOB' then
      vObj := 'PROCOBJ';
      end if;
      end if;

      --Datei erstellen
      vDatei := lower('crt_' || cur_rec.object_name || '.sql');
      vFHandle := UTL_FILE.FOPEN('SICHERUNG', vDatei, 'W', c_amount);

      --DDL anfordern
      SELECT DBMS_METADATA.GET_DDL(vObj, cur_rec.object_name, pSchemaname) INTO vInhalt FROM dual;
      l_clobLen := DBMS_LOB.GETLENGTH(vInhalt);
      l_pos := 1;

      --DDL-Text durchlaufen und speichern
      WHILE l_pos < l_clobLen LOOP
      ...
      END LOOP;

      UTL_FILE.FCLOSE(vFHandle);
      END LOOP;


      Mit dieser Funktion bekomme ich die DDL in eine Datei - aber das Erstellungsdatum der Datei ist eben der Zeitpunkt zu dem die Funktion läuft. Ein Kollege meinte, es gibt einen Befehl um das nachträglich zu manipulieren. Über Google habe ich aber nichts dazu gefunden.
      Zuletzt editiert von CLL; 14.07.2011, 08:23.

      Comment


      • #4
        Du hast mit den eingebauten Funktionen keine Möglichkeit das Erstelldatum der Datei zu ändern. Dazu müsstest Du Betriebssystemfunktionen aufrufen.

        Wäre es nicht vielleicht sinnvoller das gewünschte Datum in den Dateinamen einzubauen? Das Erstelldatum einer Datei kann ja durch alles mögliche wieder geändert werden.

        Dim
        Zitat Tom Kyte:
        I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

        Comment


        • #5
          die Datei wird nur archiviert, von daher ändert sich das Änderungsdatum später nicht mehr. Im Dateinamen soll es nicht sein, weil sonst die veralteten Dateien nicht überschrieben werden.

          Comment


          • #6
            In diesem Fall wäre es vielleicht am einfachsten, das Datum von außen zu ändern. Falls euer Export im Rahmen eines Buildprozesses läuft, könnte der nächste Schritt sein, dass man eine externes Tool aufruft, und das Datum der Datei setzt.

            Dim
            Zitat Tom Kyte:
            I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

            Comment


            • #7
              diesen Weg sind wir jetzt gegangen. Aus der Prozedur haben wir einen Scheduler aktiviert, der eine Datei auf dem Server ausführt, in der wiederum ein touch-Befehl steht.
              Funktioniert recht gut! Bei einem Schema habe ich allerdings manchmal den Fehler "Datei existiert nicht", weil der Scheduler mit Autodrop ist. Beim Ausführen in einer Schleife ist das manchmal zu langsam (das erneute Erstellen in der nächsten Runde wird übersprungen und beim enable fliegt er dann auf die Nase).
              Kann ich den Scheduler nach dem enable löschen ohne Gefahr zu laufen, dass er seine Arbeit abbricht?

              Comment

              Working...
              X