Zum Inhalt springen

Frage zum Delete Trigger


mb72

Empfohlene Beiträge

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 von mb72
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von dr.dimitri
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von mb72
Link zu diesem Kommentar
Auf anderen Seiten teilen

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. :P

Dim

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von mb72
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von mb72
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von streffin
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen


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 von streffin
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von grueni
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von mb72
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...