Announcement

Collapse
No announcement yet.

Alter Domain mit Stored Procedure?

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

  • Alter Domain mit Stored Procedure?

    Hallo,
    ich nutze für manche Felder als Vorgabewert das aktuelle Jahr:
    <b>Create Domain</b> dvJJ AS Smallint
    Default 2005 not null check (Value between 100 and 9999);

    Dieser Vorgabewert soll <b>im neuen Jahr automatisch angepasst</b> werden. Da in der Datenbank sowieso über eine SP verschiedene Anpassungen erledigt werden, soll diese auch ALTER DOMAIN erledigen.
    Dies ist direkt natürlich nicht möglich (ALTER wird von der SP-Language nicht unterstützt). Aber es müsste doch über die Systemtabellen gehen:

    Update RDB$Fields
    Set RDB$Default_Value = Extract(Year from Cast('Now' AS Timestamp))
    Where RDB$Fieldname = 'DVJJ'

    Aber dummerweise ist RDB$Default_Value ein Blob-Feld. Wie kann ich einen Integer-Wert auf diese Weise speichern?
    Oder wird Default_Value noch in einer anderen RDB-Tabelle gespeichert?

    Danke für Tipps!
    Jürgen

  • #2
    Zunächst mal würde ich nicht direkt auf die Systemtabellen zugreifen, zumindest nicht ohne wichrigen Grund ! Domains haben mit stored Procedures auch nichts am Hut. Insofern rate ich : Finger weg davon

    Comment


    • #3
      Danke für diese Anmerkungen,
      diese Probleme sind mir bewusst, und ich will sie auch beachten. Meine Idee, den Vorgabewert auf das aktuelle Jahr zu setzen, ist aber so praktisch, dass ich auf jeden Fall einen Weg wünsche.
      Natürlich kann ich den Befehl "Alter Domain..." direkt vom Programm aus abschicken; aber mir geht es um die Automatik innerhalb der Datenbank.
      Nochmals Danke für Vorschläge!
      <b>Im Übrigen alles Gute für 2006.</b>
      Jürge

      Comment


      • #4
        Es geht also lediglich um einen Vorgabewert ? Da stellt sich die Frage, ob es sinnvoll ist, dafür jedesmal die Datenbank-Struktur umzubauen. Ist Dir eventuell nur nicht bekannt, daß man jedem Feld schon bei der Definition einen Default-Wert mitgeben kann ?

        z.B. so :

        CREATE TABLE NEW_TABLE (
        NEW_FIELD timestamp DEFAULT CURRENT_TIMESTAMP
        );

        Das ganze kann man sicherlich auch mit Domains regeln, aber warum so umständlich

        Comment


        • #5
          @Hans-Jörg,
          eigentlich wollte ich mit meiner Frage keine Diskussion über Domains eröffnen, sondern setze voraus, dass Domains viele Arbeiten einfacher und nicht komplizierter machen.
          <i>In Büchern (nicht nur von Andreas Kosch) und vielen Beiträgen hier im Forum werden die Vorteile beschrieben: Wenn Eingabebedingungen - default, not null, check(value) - nicht nur einmal, sondern für mehrere Felder in verschiedenen Tabellen benutzt werden, ist es natürlich einfacher, dies einmal mit einer Domain statt wiederholt festzulegen. Dies gilt natürlich erst recht bei späteren Änderungen.
          Im Übrigen arbeitet Interbase intern ebenfalls mit Domains: Jede Felddefinition wird in eine eigene Domain umgesetzt. Also würde ohne Domains die gleiche Eingabebedingung in mehreren automatisch erzeugten Domains stehen statt in einer einzigen gezielt definierten Domain.</i>
          <u>Also nochmals deutlicher:</u> mit meinem Vorgehen will ich die folgenden Punkte regeln.
          <b>Vorgabewert das aktuelle Jahr</b> (nicht das Datum): Natürlich kann das über Trigger Before Insert erledigt werden (aber dann muss das für jede Tabelle und jedes Feld einzeln definiert werden):
          IF ( NEW.AktJahr IS NULL )
          THEN NEW.AktJahr = EXTRACT( YEAR FROM CURRENT_DATE );
          Einfacher sollte die Festlegung über die Domain sein:
          Create Domain dvJJ AS Smallint Default 2005 not null check (Value between 100 and 9999);
          <i>Falls jemand glaubt, dass das nicht nützlich ist: In der Regel wird eine Zeitschrift im laufenden Jahr verschickt; aber das Heft 1/2006 erscheint meist schon im Dezember 2005. In der Regel wird die Buchhaltung im laufenden Jahr erledigt; aber Buchungen für den Dezember werden erst am Anfang des nächsten Jahres gespeichert. Für den Normalfall gilt der Vorgabewert, für Ausnahmen der gezielt eingetragene.</i>
          <b>Vorgabewert automatisch ändern</b> am Anfang eines neuen Jahres: 'Alter Domain' kann das leisten, kann aber (wie auch 'Alter Table') nicht aus einer SP heraus aufgerufen werden. Wenn aber sowieso jeden Monat eine SP diverse Prüfungen und Anpassungen erledigt, könnte sie den Vorgabewert gleich mit ändern (wie ich es am Anfang dieser Diskussion überlegte).
          <b>Zugriff auf Systemtabellen:</b> Natürlich muss man sich damit sehr zurückhalten und darf nur das machen, was wirklich unproblematisch ist und keine Nebenwirkungen hat. Genau deshalb frage ich, wie meine Idee 'Update RDB$Fields' umgesetzt werden kann.
          Vielleicht kann ich dafür eine passende Antwort bekommen? Danke!
          Jürge

          Comment


          • #6
            Hallo Jürgen,
            eine naheliegende Idee wäre den Default-Wert einer Domain mit EXTRACT(...) zu setzen, aber das ist auch nur naheliegend, und keine Lösung, weil die DEFAULT Syntax dies nicht unterstützt.
            <br>
            Die Änderung über die Systemtabelle ist nicht wirklich möglich. Man könnte zwar den Source-Code für die DEFAULT Option über ein Update-Statement in die eine Systemtabelle reinschießen, aber das Problem dabei ist, dass auch die DEFAULT-Anweisung als compilierte Form (BLR) für die Engine zur Verfügung stehen muss. Dies ist mit einem direkten Systemtabellen-Update nicht der Fall.
            <br>
            Mir fällt eigentlich nur ein, dass die Domain mit ALTER DOMAIN geändert werden muss. Dies könnte natürlich über einen Task-Scheduling Mechanismus von Windows oder Linux automatisiert gemacht werden. Ob das zielführend und verlässlich (was ist, wenn jemand diesen Job abdreht) sei dahingestellt.
            <br>
            Frage: Wer ruft die Stored Procedure monatlich auf? Geschieht das manuell oder automatisch? Wenn automatisch, was spricht dagegen, dass man in diesem automatisierten Prozess ein ALTER DOMAIN absetzt?
            <br>
            Thoma
            Thomas Steinmaurer

            Firebird Foundation Committee Member
            Upscene Productions - Database Tools for Developers
            Mein Blog

            Comment


            • #7
              Hallo Thomas,
              danke für die ausführlichen Gedanken.
              ** Default-Wert einer Domain mit EXTRACT: Das hatte ich natürlich als erstes probiert.
              ** DEFAULT-Anweisung als compilierte Form (BLR): Schade, dann geht das natürlich nicht.
              ** Task-Scheduling: Das wären wohl Kanonen für Spatzen (und, wie Du sagst, nicht zuverlässig).
              ** Der vorgesehene Arbeitsablauf: In der Datenbank ist ein Logbuch enthalten. Wenn sich USER beim Programmstart angemeldet hat, wird die Procedure SP_Logbuch_Programmstart aufgerufen; diese kann anhand der IB-Standards automatisch USER, HOST_NAME und 'NOW' feststellen und ins Logbuch eintragen. Dabei wird geprüft, ob es sich um den ersten Eintrag im Laufe eines Monats handelt; dann wird ggf. die Procedure SP_Monatsanpassungen aufgerufen, die alle dazu gehörenden Maßnahmen ausführt. Hierher passt natürlich auch 'Alter Domain'; aber Alter-Befehle werden laut Dokumentation nicht in SPs akzeptiert.
              Wenn uns nicht noch etwas Besseres (mit Automatik) einfällt, werde ich Folgendes regeln:
              1. SP_Logbuch_Programmstart liefert einen Rückgabewert 'Jahresanfang = True/False'.
              2. Das Programm wertet diesen Rückgabewert aus; bei 'True' wird gezielt der 'Alter Domain'-Befehl als einzelne SQL-Anweisung abgeschickt.
              Nochmals danke für die Informationen.
              Jürge

              Comment

              Working...
              X