mb72 Geschrieben 19. Oktober 2009 Teilen Geschrieben 19. Oktober 2009 (bearbeitet) Hallo zusammen, ich habe folgende Tabellen (Zeitungen, Sportvereine, Zuordnungstabelle) In der Zuordnungstabelle wird definiert, welche Zeitung zu welchem Sportverein gehört. Ich möchte jetzt einen Trigger schreiben, der immer dann ausgelöst wird, wenn in den Tabellen Zeitungen oder Sportverein ein Datensatz gelöscht wird. Also z.B. eine Zeitung gelöscht wird. Dann muss ja auch aus der Relationstabelle die Zuordnung raus.. also bsp. ID=1 || ID=2 (ID1= Bildzeitung --> die gehört zu dem Sportverein Bremen ID2), in dem Fall wäre es ja die ID Nr.1 (in der Zuordnungstabelle) aber es soll ja variabel gehalten werden. Ich dachte an (für z.b. die Tabelle Sportvereine): CREATE TRIGGER AFTER DELETE ON Sportvereine FOR EACH ROW BEGIN IF .... DELETE * from Zuordnungstabelle WHERE ?!?! wie kann man das variable halten?!? Bearbeitet 19. Oktober 2009 von mb72 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 19. Oktober 2009 Teilen Geschrieben 19. Oktober 2009 Hi, ist die Verbindung Sportverein zu Zeitung eine 1:n Beziehung? Falls ja, dann brauchst Du die Zuordnungstabelle nicht sondern kannst das ganz bequem über einen FK-Constraint lösen. Falls es sich um eine n:m beziehung handelt, würde ich davon Abstand nehmen diese Logik in einem Trigger abzulegen und statt dessen eine PL/SQL Prozedur schreiben die diese Aufgabe übernimmt. Aber da man niemanden zu seinem Glück zwingen kann: CREATE TRIGGER /*es fehlt der Name*/ AFTER DELETE ON Sportvereine FOR EACH ROW BEGIN IF .... /*Ohne * Da ist nicht Access sondern Oracle*/ DELETE * from Zuordnungstabelle WHERE sportvereinid=:old.sportvereinid; Die Spaltennamen musst natürlich evtl. anpassen. Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mb72 Geschrieben 19. Oktober 2009 Autor Teilen Geschrieben 19. Oktober 2009 huch, schnelle antwort vom Dr. ! Danke sehr. mhh, es ist eine 1:n Beziehung. Also ich muss für jede neue/alte Beziehung einen Datensatz anlegen. FK-Constraint sagt mir nix.. aber da gibt es ja was zum nachlesen :-) Super, danke erstmal für den Tipp. Mache mich gleich mal ran.. noch ne frage. dieses old.sportvereinid erkennt er automatisch..? cool. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 19. Oktober 2009 Teilen Geschrieben 19. Oktober 2009 (bearbeitet) FK-Constraint sagt mir nix. Man nennt ihn auch Foreign Key oder Fremdschlüssel und gehört zusammen mit dem PK (Primary Key) zur Gruppe der Integrity Constraints. noch ne frage. dieses old.sportvereinid erkennt er automatisch..? cool. In einemTrigger hast Du die Möglichkeit auf die alten und neuen Werte zuzugreifen. Das geht mit :old.spaltenname und :new.spaltenname Allerdings ist in einem Insert Trigger logischerweise kein old und in einem Delete kein new möglich. Dim Bearbeitet 19. Oktober 2009 von dr.dimitri Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mb72 Geschrieben 19. Oktober 2009 Autor Teilen Geschrieben 19. Oktober 2009 (bearbeitet) danke für die info.. gibt es eine gute seite, wo das mit den triggern erklärt wird.. ich kenne nur die mysql-seiten.. aber mal was für sql-klappspaten wie mich... dann müsste der so laufen, oder? CREATE TRIGGER löschen AFTER DELETE ON Sportvereine FOR EACH ROW BEGIN DELETE * from Zuordnungstabelle WHERE sportvereine_id=: old.sportvereine_id; END; Bearbeitet 19. Oktober 2009 von mb72 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 19. Oktober 2009 Teilen Geschrieben 19. Oktober 2009 Sofern Du jetzt noch die korrekte Schreibweise für den DELETE Befehl verwendest und die Spaltennamen korrekt sind sollte das so laufen. ich kenne nur die mysql-seiten Kein guter Anlaufpunkt wenn man für Oracle entwickelt Ich würde mal den Concepts Guid empfehlen. Wenn du in der verlinkten Seite ein Kapitel zurück gehst kommst auch gleich zum Thema Data Integrity und ein Kapitel nach vorne dürfte auch interessant für dich sein. Ansonsten die üblichen Verdächtigen. Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mb72 Geschrieben 19. Oktober 2009 Autor Teilen Geschrieben 19. Oktober 2009 ok, ist wirklich nen interessantes thema mit den triggern. danke für deine schnelle hilfe, werde es später mal probieren. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mb72 Geschrieben 19. Oktober 2009 Autor Teilen Geschrieben 19. Oktober 2009 Bekomme immer wieder einen Syntax-Fehler ausgeworfen. Laut mysql ist das die richtige syntax, oder? CREATE TRIGGER löschen AFTER DELETE ON Sportvereine FOR EACH ROW BEGIN DELETE from Zuordnungstabelle WHERE sportvereine_id=old.sportvereine_id; END; Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 19. Oktober 2009 Teilen Geschrieben 19. Oktober 2009 Mysql? Ich dachte Du verwendest Oracle. Zumindest sieht die Syntax so aus. Unabhängig davon fallen mir zwei Dinge auf: Es fehlt die genaue FehlerausgabeNiemals, niemals, niemals Umlaute in Objektnamen verwenden. Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mb72 Geschrieben 19. Oktober 2009 Autor Teilen Geschrieben 19. Oktober 2009 danke, hatte ich ausnahmsweise auch selbst bemerkt. ja, wurde auch schon in loeschen umgewandelt.. fehlerausgabe bei eingabe in die mysql-command line? wie gesagt, die syntax ist mysql-like. "you have an error in your sql syntax" habe auch bald nen syntax-error Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 19. Oktober 2009 Teilen Geschrieben 19. Oktober 2009 Nun ja falls du es nicht bemerkt hast, ich bin die ganze Zeit davon ausgegangen dass Du Oracle verwendest, habe Links zur Oracle Doku gepostet und natürlich auch die Oracle Syntax verwendet. Wenn du mysql nutzt kannst Du alles was ich geschrieben haben auch direkt wieder vergessen, denn die Trigger dort sehen komplett anders aus. Auch old und new gibt es dort nicht. Näheres muss dir dann jemand sagen, der mysql besser kennt. Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mb72 Geschrieben 19. Oktober 2009 Autor Teilen Geschrieben 19. Oktober 2009 ok, aber die syntaxt scheint ähnlich .. auch soll es old und new geben.. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mb72 Geschrieben 20. Oktober 2009 Autor Teilen Geschrieben 20. Oktober 2009 (bearbeitet) so, mit Hilfe habe ich jetzt die folgende MySQL-Syntax geschrieben - leider bekomme ich nach wie vor die Syntax-Error-Meldung: Vielleicht weiß ja jemand Rat. CREATE TRIGGER sportloesch AFTER DELETE ON SPORTVEREINE FOR EACH ROW BEGIN DELETE FROM relationstabelle WHERE sportvereine_id = OLD.sportvereine_id; END; Bearbeitet 20. Oktober 2009 von mb72 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
grueni Geschrieben 20. Oktober 2009 Teilen Geschrieben 20. Oktober 2009 Warum machst du einmal DELETE FROM Zuordnungstabelle... und jetzt DELETE FROM relationstabelle...? Klappt es mit DELETE FROM relationstabelle WHERE relationstabelle.sportvereine_id = OLD.sportvereine_id; Ich würde mal die DELETE-Anweisung separat testen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mb72 Geschrieben 20. Oktober 2009 Autor Teilen Geschrieben 20. Oktober 2009 hallo! zurodnungstabelle ist gleich relationstabelle ... sorry für die wechselnde schreibweise. DELETE FROM relationstabelle WHERE relationstabelle.sportvereine_id = OLD.sportvereine_id; <-- habe ich auch schon versucht. seperat testen? also ich habe gerade einen datensatz mit hilfe der mysql-command-line(dos-box) in der Tabelle Sportvereine mit dem befehl: select from sportvereine where name ="SC Paderborn"; das hat geklappt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
grueni Geschrieben 20. Oktober 2009 Teilen Geschrieben 20. Oktober 2009 Meinst du DELETE FROM sportvereine... oder SELECT FROM sportvereine... ? Verwendest du wirklich die Kommandozeile? Ich würde für den Zweck den Query-Browser nehmen. Ich glaub nämlich, daß die Kommandozeile dein SQL-Statement nach dem ersten auftretenden Semikolon ausführt, und das wäre bei dir noch vor dem END;. Ich würds entweder im Batch-Mode (MySQL :: MySQL 5.4 Reference Manual :: 3.5 Using mysql in Batch Mode) oder wie gesagt mit dem Query-Browser versuchen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mb72 Geschrieben 20. Oktober 2009 Autor Teilen Geschrieben 20. Oktober 2009 (bearbeitet) nein, ich möchte, dass der tigger zündet, wenn in der tabelle Sportvereine etwas gelöscht wird.. ok, habe mir den mysql Query Brwoser geholt.. ist nen super tipp gewesen.. leider kommt auch hier der fehler : You have an error in your SQL syntax, check the manual... to use near END.... at line 1.. oder habe ich nicht ausreichende rechte? aber ich habe mich als root angemeldet?! Bearbeitet 20. Oktober 2009 von mb72 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
grueni Geschrieben 20. Oktober 2009 Teilen Geschrieben 20. Oktober 2009 Versuch es mal ohne BEGIN und END Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mb72 Geschrieben 20. Oktober 2009 Autor Teilen Geschrieben 20. Oktober 2009 auch das führt zur fehlermeldung.. kann es sein, dass es an der datenbank (an den tabellen) liegt? aber dann käme ja kein syntax-fehler, oder?!? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
grueni Geschrieben 20. Oktober 2009 Teilen Geschrieben 20. Oktober 2009 Kann ich dir nicht sagen, ich hab hier keinen Zugriff auf eine MySql-DB. Ich hab nur noch folgenden Thread gefunden: http://www.tutorials.de/forum/relationale-datenbanksysteme/343592-fehler-beim-erstellen-eines-delete-triggers.html Der Threadersteller hatte dasselbe Problem, gelöst wurde es dann im Endeffekt über ein Foreign Key Constraint. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
streffin Geschrieben 20. Oktober 2009 Teilen Geschrieben 20. Oktober 2009 (bearbeitet) Eine kleine Verständnissfrage : simma hier jetzt auf ner MySql DB oder sin mer bei Oracle ? Ich bin grad etwas verwirrt und wart die antwort ab bevor ich weiter nachdenk muss ich ehrlich sagen eines was ich aber schonma sagen kann : oder habe ich nicht ausreichende rechte? aber ich habe mich als root angemeldet?! daran liegts nicht. Syntax error is Syntax error, die DB weis nich was du von ihr willst Und post bitte mal nochmal dein SQL komplett rein, das mer aufm gleichen Stand sin Bearbeitet 20. Oktober 2009 von streffin Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mb72 Geschrieben 20. Oktober 2009 Autor Teilen Geschrieben 20. Oktober 2009 Nabend Sven, es ist eine mySQL-Datenbank, hier der SQL-TRIGGER: CREATE TRIGGER löschen AFTER DELETE ON Sportvereine FOR EACH ROW BEGIN DELETE from relationstabelle WHERE relationstabelle.sportvereine_id= OLD.sportvereine_id; END; Es soll wohl auch mit einer Fremdschlüssellösung geben, Wie auch immer das geht :-) Viele Grüße Mario Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
streffin Geschrieben 20. Oktober 2009 Teilen Geschrieben 20. Oktober 2009 (bearbeitet) CREATE TRIGGER löschen AFTER DELETE ON Sportvereine FOR EACH ROW BEGIN DELETE from relationstabelle WHERE relationstabelle.sportvereine_id= OLD.sportvereine_id; END; Ohne es getestet zu haben : der ; nach dem Delete, lass den mal weg, weil deine SQL anweisung ist da noch nicht fertig. Du schreibst da ja kein Query, du schreibst nen Trigger, also du sagst dem Server, erstell mit nen Trigger. Wenn der Mysql server das so interpretiert wie ich das grade tu, dann schliest du mit dem ; nach dem DELETE die anweisung ab, und ja, dann fehlt das END zu dem BEGIN. versuch das mal, das könnts schon gewesen sein und ich persöhnlich würd da nen Trigger nehm, aber gut, ich hab die Weisheit bei Gott auch nich mit Löffeln gefressen // edit @ grueni no disrespect, aber ich denk nen Syntax error sollt man so oder so erstmal beheben, unabhänig ob mans auf andere weise lösen kann / könnte / sogar sollte, syntax error is nix gut, grad jemand der grad in die Materie einsteigt sollt den Fehler erstma ausbügeln würd ich behaupten. Wie gesagt, will dich da jetzt persöhnlich oder fachlich angreifen. Mfg Sven Bearbeitet 20. Oktober 2009 von streffin Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
grueni Geschrieben 20. Oktober 2009 Teilen Geschrieben 20. Oktober 2009 (bearbeitet) Du solltest wie Dr. Dimitri schon erwähnt hat keine Umlaute in Bezeichnern verwenden. Was für eine MySql-Version hast du im Einsatz? Sind beide ID-Felder vom gleichen Datentyp? Sind es InnoDB-Tabellen? Um das mit einem FK-Constraint zu lösen mußt du zuerst die Spalten indexieren und anschließend mit ALTER TABLE den FK-Constraint hinzufügen. Detailliert kannst du das hier nachlesen: MySQL :: MySQL 5.1 Reference Manual :: 13.6.4.4 FOREIGN KEY Constraints <edit> Wenn man dev.mysql.com glauben darf, dann liegt es nicht am Strichpunkt nach der DELETE-Anweisung. Siehe: http://dev.mysql.com/doc/refman/5.1/en/create-trigger.html </edit> Bearbeitet 20. Oktober 2009 von grueni Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mb72 Geschrieben 20. Oktober 2009 Autor Teilen Geschrieben 20. Oktober 2009 (bearbeitet) hi sven, ich würde liebend gerne den trigger nehmen, wenn er denn gehen würde. ich habe es gerade mal probiert, das ; wegzulassen. ohne erfolg. ich meine, das habe ich heute nachmittag auch schon mal probiert. ging da auch net. echt zum verzweifeln. es gibt doch keine möglichkeit mehr.. der sql-trigger (syntax) scheint ok zu sein. ich habe alles kontrolliert, schreibweise usw. vielleicht muss ich mal auf einem testrechner eine andere my-sql-datenbank einrichten und alles nochmal eingeben. aber das hilft mir ja nicht weiter.. wobei, dann wüßte ich, ob es an der installation liegt. aber wie du sagst, syntax--error = syntax--error. hey, erstmal danke, grüße mario h grueni, MySQL-Client-Version: 3.23.57 u. Server Version: 4.1.22-community-nt; die tabellen sind vom typ: innoDB; die ID-Felder sind beide vom Typ INT(5). Ich hoffe, ich kann das mit dem FK noch umschiffen... benutze keine umlaute in der syntax (der Trigger heißt loeschen) Grüße Mario Bearbeitet 20. Oktober 2009 von mb72 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.