Announcement

Collapse
No announcement yet.

Löschen in editierbaren VIEW unterbinden

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

  • Löschen in editierbaren VIEW unterbinden

    Hallo zusammen,

    ich haben eine VIEW (VW_EAUFTRAG) die nur Datensätze anzeigt deren Löschdatum, Feld DD = NULL ist.
    Ein Delete auf die VIEW soll nur den Eintrag eines TimeStamps in
    das Feld DD der Tabelle EAUFTRAG zur Folge haben.
    Zum Insert/Update/Delete werden Trigger eingesetzt.


    CREATE VIEW VW_EAUFTRAG(ID, ... , DD)
    AS
    select
    ID, ... , DD
    from EAUFTRAG
    where DD is NULL;

    CREATE TRIGGER VW_EAUFTRAG_BD FOR VW_EAUFTRAG
    ACTIVE BEFORE DELETE POSITION 0
    AS
    BEGIN
    UPDATE EAUFTRAG
    SET DD = CURRENT_TIMESTAMP
    WHERE (ID = OLD.ID);
    END

    Wenn ich nun ein das Statement
    DELETE FROM VW_EAUFTRAG WHERE ID=2
    ausführe, bekomme ich folgendes Ergebnis (IBExpert):


    1 record(s) was(were) updated in EAUFTRAG
    1 record(s) was(were) deleted from EAUFTRAG

    und der Datensatz in EAUFTRAG ist weg!
    Es wird also das Update im Trigger VW_EAUFTRAG_BD ausgeführt und anschließend zusätzlich der Satz in der Tabelle gelöscht.

    Frage:
    Wer oder was veranlaßt FB 1.5.2 den Satz zu löschen?
    Ich war der Meinung für das "Löschen" in einer View ist nur der Trigger verantwortlich.
    Wie kann ich das Löschen der Satzes in EAUFTRAG unterbinden?

    alex

  • #2
    In Firebird ist das schwierig. Du kommst im Grunde nur raus, indem du eine Exception verursachst (FB-Cracks, korrigiert mich, wenn ich was Falsches sage).

    Wenn du die Möglichkeit hättest, das DBMS zu wechseln, könnte ich dir sagen, dass das in PostgreSQL viel eleganter zu lösen ist ... aber das ist wahrscheinlich utopisch.

    Gruß,

    Stefan Balzte

    Comment


    • #3
      Hallo Stefan,

      erstmal Danke für deine Antwort. Ich habe inzwischen aus einem
      anderen Forum folgende Nachricht erhalten:
      Es hat früher in Interbase so funktioniert wie ich mir das vorgestellt habe, dh. für das Löschen war nur der Trigger zuständig.
      Irgendwann hat Borland das aber geändert.
      In Firebird 2.x soll es aber wieder so funktioniern früher.

      Bis dahin kann ich mir damit helfen das ich in die VIEW ein
      Dummy-Join einfüge und damit das automatisch Löschen unterbinde.
      Die VIEW sieht dann so aus:

      CREATE VIEW VW_EAUFTRAG(ID, ..., DD)
      AS
      select ID, ..., DD
      from EAUFTRAG
      left join RDB$DATABASE on (1=0)
      where DD is NULL;

      ich werde also doch beim Feuervogel bleiben ;-)

      ale

      Comment

      Working...
      X