Announcement

Collapse
No announcement yet.

mysql delete abfangen mit trigger oder procedure

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

  • mysql delete abfangen mit trigger oder procedure

    hallo zusammen.

    erst mal muss ich sagen dass das nen super forum ist. hat mir bei der einen oder anderen frage schon sehr geholfen. was z.B. programmieren(c++) betrifft.

    jetzt hab ich aber ein problem mit mysql. hab auch schon ne std. gegoogelt. aber bin auf keinen grünen zweig gekommen.

    und zwar:

    ich hab 3 tabellen in mysql. system, sys_param und sys_config.
    system enthält eigentlich nur den system namen und sys_param einen parameternamen. in sys_config werden die parameter dann mit dem system und values zu den parametern verein. quasi ne raltionstabelle.

    auf jeden fall wollte ich jetzt einen trigger schreiben, welcher mir bei einem delete auf einen eintrag in der sys_param in die sys_config schaut ob dieser param. noch verwendet wird und falls ja, das delete blockiert um inkonsistenten zu vermeiden. schön wäre auch mit ner fehlermeldung

    so wie ich es jetzt aber ergoggelt habe, kann ein trigger keine transaktionen unterbrechen.
    sooo... wie mach ich das denn nun am besten?
    mit einer stored procedure? dachte aber die wären nur sinnvoll wenn ich was einfügen will.

    gruß aus ffm,
    mitch

  • #2
    Hallo,

    sowas ist eigentlich Aufgabe eines Fremdschlüssel-Constraints und nicht für einen Trigger!

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      ja das hab ich eben auch schon mitbekommen
      hätte ich mir auch denken können.

      noch mal kurz eine andere frage, und zwar:

      ich hab eine tabelle. port heißt die. die hat auf jeden fall ein ID feld. ein port ist immer zu genau einem anderen port verbunden. d.H. ich mach ein 2. feld, das nenn ich z.B. connect2 und mach dann eine 1:1 relation auf die port.ID oder?

      dann müssten doch eigentlich die constraints auch ziehen, oder?
      machen sie aber nicht, ich kann z.B. einen port löschen, der noch zu einem anderne verb. ist.

      gruß aus ffm

      Comment


      • #4
        Dann verwendest du entweder die Option ON DELETE CASCADE oder Du hast die myisam Engine die keinerlei referentielle Integrität unterstützt.

        Dim
        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


        • #5
          also ich hab als engine InnoDB.
          ansonsten, das ON DELETE CASCADE, wo gebe ich das denn an? in der relation, oder?
          also ich benutz zum designen mysql workbench. dort hab ich in den settings für die relation bis jetzt noch nichts gesehen.

          Comment


          • #6
            Hallo,
            Originally posted by mitch-geht-ab View Post
            ...dann müssten doch eigentlich die constraints auch ziehen, oder?
            Das kommt darauf an in "welcher Richtung" der Constraint definiert ist. Mal angenommen du hast zwei Tabellen:
            [highlight=sql]
            CREATE tableA (
            id int(8) NOT NULL,
            ...
            CONSTRAINT PRIMARY KEY (id)
            );

            CREATE tableB (
            id int(8) NOT NULL,
            id_a int(8) NOT NULL,
            ...
            CONSTRAINT PRIMARY KEY (id),
            CONSTRAINT FOREIGN KEY b_references_a (id_a)
            REFERENCES tableA (id)
            );
            [/highlight]
            Damit existiert eine Fremdschlüsselbeziehung zwischen tableB und tableA.
            Du kannst jetzt keinen DS in tableB einfügen, wenn kein korrespondierender DS in tableA existiert. Es ist jedoch möglich in tableA beliebige DS einzufügen. Aus tableA läßt sich dagegen kein DS löschen, der noch eine Entsprechung in tableB hat. In tableB lassen sich die DS beliebig löschen.

            Wenn du eine "bidirektionale" Abhängigkeit benötigst, dann mußt du das mit drei Tabellen abbilden:
            [highlight=sql]
            CREATE tableA (
            id int(8) NOT NULL,
            ...
            CONSTRAINT PRIMARY KEY (id)
            );

            CREATE tableB (
            id int(8) NOT NULL,
            ...
            CONSTRAINT PRIMARY KEY (id)
            );

            CREATE tableC (
            id int(8) NOT NULL,
            id_a int(8) NOT NULL,
            id_b int(8) NOT NULL,
            ...
            CONSTRAINT PRIMARY KEY (id),
            CONSTRAINT UNIQUE KEY a_b_uniqunes (id_a, id_b),
            CONSTRAINT FOREIGN KEY c_references_a (id_a)
            REFERENCES tableA (id)
            CONSTRAINT FOREIGN KEY c_references_b (id_b)
            REFERENCES tableB (id)
            );
            [/highlight]
            Jetzt lassen sich zwar in tableA und tableB beliebig DS einfügen, ist jedoch einmal eine Beziehung zwischen beiden über tableC hergestellt, dann läßt sich weder aus tableA noch aus tableB ein DS löschen, solange der zugeordnete DS in tableC existiert.

            Soweit zur Theorie .

            Gruß Falk
            Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

            Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

            Comment

            Working...
            X