Announcement

Collapse
No announcement yet.

for each row-Trigger

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

  • for each row-Trigger

    Hallo!

    Ich habe ein Verständnisproblem mit o.g. zeilenorientierten Triggern:
    in meinem Skript steht dass die zugeordnete Tabelle bei Einsatz von for each row gesperrt sei, auch für das reine Lesen eines Datensatzes.
    Nun habe ich folgende Aufgabe:

    "Ein Spieler, der 'Torhüter' ist, darf auf keiner anderen Position spielen"

    Und folgenden Auszug aus der Lösung:

    ...
    before insert or update of position on spieler_position
    for each row
    declare anzahl int;
    begin
    if :new.position='Torhüter' then
    select count(*) into anzahl from spieler_position where spieler = :new.nr;
    ...

    Ich dachte man darf in diesem Fall nicht auf die Tabelle spieler_position zugreifen?

    Danke für jede Hilfe!

  • #2
    Moin,

    wird das Skript weg und/oder buch einen anderen Kurs. Die Art und Weise wie das gelöst wird ist schon per Definition ein Bug.
    ABER: Soweit kommst du gar nicht, da Oracle dies bereits bei Ausführung des Triggers mit einem ORA-04091 quitiert und beendet.

    Insofern ist das Skript am Anfang richtig, und im Beispiel falsch. Eine solche Aufgabenstellung kann man im einfachsten Fall mit einem Unique Index lösen, ansonsten muss man mit Tabellenlocks arbeiten und dies im Programm erledigen.
    Trigger - no way.
    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


    • #3
      Na das macht Hoffnung für meine Klausur ... Danke für deine Antwort.

      Comment


      • #4
        Originally posted by Weristdaswohl View Post
        Na das macht Hoffnung für meine Klausur ... Danke für deine Antwort.
        Dimitri hat Recht. Zur Problematik mit den Triggern (Oracle, Mutating Table..):
        Genau in der Form ist das Oracle spezifisch, aber ich weiß nicht, wie andere Systeme sich da verhalten.
        Konzeptionell würde ich die Aufgabenstellung nie über einen Trigger lösen, sondern per Unique Constraint (Dimitri) oder per Insert/Update Stored Procedure (oder Modellangaben), die die Überwachung übernimmt und mehr Flexibilität und Transparenz bietet. Trigger setzt man m.E. nur für Hardcore Basics ein.

        Versuch herauszufinden, was die Aufgabe oder der Lerngruppenleiter Dir beibringen wollte und frag notfalls nach.
        Gruß, defo

        Comment


        • #5
          Originally posted by Weristdaswohl View Post
          Na das macht Hoffnung für meine Klausur ... Danke für deine Antwort.
          Da der Trigger bei der Ausführung sofort einen ORA-04091 wirft, ist der Beleg, dass die Triggerlösung nicht funktioniert zumindest sehr einfach zu erbringen.
          Wenn Du uns etwas mehr Informationen lieferst (insb. Tabellenaufbau) können wir dir vielleicht eine alternative Lösung zeigen.
          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


          • #6
            Der genannte Oracle-Fehler tritt im angegebenen Beispiel von WERISTDASWOHL aber nicht auf! Er würde aber auftreten, wenn statt dem Triggerzeitpunkt BEFORE der Triggerzeitpunkt AFTER (=> Mutating Table) verwendet würde.

            kuemmelchen

            Comment

            Working...
            X