1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Datenbank für AnforderungsManagement

Dieses Thema im Forum "Datenmodellierung, Datenbank-Design" wurde erstellt von RedFerret, 3 Januar 2013.

  1. akretschmer

    akretschmer Datenbank-Guru

    SQL sagt viel, ich nutze es ja auch. Welche Datenbank nutzt Du? Oracle, MySQL, M$SQL, DB2, Informix, SQLite, ...?

    Mein count(1) zählt einfach, wie viele Datensätze für die Hauptaufgabe das Flag 'erledigt' auf FALSE haben, also nicht erledigt sind. Ist das 0, dann sind alle Unteraufgaben für die genannte Aufgabe erledigt und ich kann in der Aufgaben-Haupttabelle die Aufgabe als erledigt setzen. Das 'new' ist einfach eine Variable, die die DB bereitstellt: sie enthält den NEUEN Datensatz. Es gibt auch eine Variable 'old', die man nutzen kann. So kann man innerhalb der Triggerfunktion (beim Update) auf den alten und neuen Stand des Datensatzes zugreifen.

    Andreas
     
    RedFerret gefällt das.
  2. RedFerret

    RedFerret Benutzer

    Achso, ich benutze MySQL.

    Das hab ich jetzt so weit verstanden. Habe den Trigger jetzt noch etwas angepasst:

    Code:
    DELIMITER //
    CREATE TRIGGER erledigung
    AFTER UPDATE ON unteranforderungen
    FOR EACH ROW
    BEGIN 
    IF (SELECT count(1) 
    FROM unteranforderungen
    WHERE hauptanforderungen = NEW.hauptanforderungen AND NOT erledigt
    ) = 0 
    THEN 
    UPDATE hauptanforderungen 
    SET erledigt = true 
    WHERE hauptanforderungen.anforderungsid = NEW.hauptanforderungsid; 
    END IF;  
    END//
    DELIMITER ;
    
    Bekomme aber die Fehlermeldung: "Error Code: 1054. Unknown column 'hauptanforderungen' in 'NEW'0.001 sec"
     
  3. akretschmer

    akretschmer Datenbank-Guru

    Hast Du denn eine Spalte mit diesem Namen? Vermutlich nicht ...

    Andreas
     
  4. RedFerret

    RedFerret Benutzer

    Ah, da muss hauptanforderungsid rein.

    Also es wurde jetzt ohne Fehlermeldung geschluckt. Ich werds mal testen ob es funktioniert.
    Vielen Dank schon mal :)
     
  5. RedFerret

    RedFerret Benutzer

    Leider funktioniert der Trigger so wie er ist bei mir nicht... Hab jetzt schon einiges ausprobiert aber das erledigt Flag bei den HauptAnforderungen bleibt auf 0.

    Dazu kommt, dass ich

    "Error Code: 1436. Thread stack overrun: 6072 bytes used of a 131072 byte stack, and 128000 bytes needed. Use 'mysqld -O thread_stack=#' to specify a bigger stack."

    bekomme, sobald ich eine UnterAnforderung mit erledigt 0 erzeuge, dann auf 1 setze, dann wieder auf 0 setze und dann noch einmal auf 1 setze. Dann muss ich erst wieder die Tabelle löschen, neu erzeugen und mit Testdaten füllen bevor ich weiter testen kann. Das machts nicht einfacher... bin schon am verzweifeln.
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Kann Dir da leider nicht weiter helfen - MySQL haben wir zwar (bei Kunden) massig im Einsatz, aber so tief stecke ich da nicht drin. Aber vielleicht kann jemand anders Dir helfen ...

    Andreas
     
  7. RedFerret

    RedFerret Benutzer

    Vielen Dank aber trotzdem.

    Auf die Gefahr hin dass ich meinem Avatarbild optisch immer ähnlicher werde, probier ich heute noch ein bisschen rum.
     
  8. akretschmer

    akretschmer Datenbank-Guru

    *smile*

    Ähm, ich habe für das 'erledigt' als Datentyp BOOL verwendet, und arbeite halt auch mit TRUE/FALSE. MySQL kennt, soweit ich weiß, kein BOOL. In Deiner Trigger-Definition scheinst das aber so von mir übernommen zu haben - möglicherweise keine so gute Idee ...


    Andreas
     
    RedFerret gefällt das.
  9. RedFerret

    RedFerret Benutzer

    Stimmt, bei MySQL wird boolean in tinyint umgewandelt. Das akzeptiert wahrscheinlich kein "true". Werd da mal ansetzen ;)
     
  10. RedFerret

    RedFerret Benutzer

    Der Trigger scheint zu funktionieren, ich denke dass es an dieser Fehlermeldung liegt:

    Error Code: 1436. Thread stack overrun: 6072 bytes used of a 131072 byte stack, and 128000 bytes needed.
    Use 'mysqld -O thread_stack=#' to specify a bigger stack.0.002 sec

    Da steht ja, dass ich einen größeren Stack angeben soll, mit "mysqld -O thread_stack=#". Aber ich habe keine Ahnung wie das funktioniert. Kann mir da jemand weiterhelfen?


    EDIT:
    Habe mich mal mit meiner Fehlermeldung durchs Inet gefräst und jetzt die my.cnf Datei geändert. Und zwar habe ich die Größe vom Thread Stack von 64K auf 256K geändert. Allerdings kommt jetzt die nächste Fehlermeldung wenn ich ein Attribut einer UnterAnforderung verändere:

    update unteranforderungen set erledigt = 1 where anforderungsid = 1300111
    Error Code: 1054. Unknown column 'unteranforderungen.hauptanforderungsid' in 'where clause'0.003 sec

    Das seltsame ist, dass das Attribut trotz Fehlermeldung geändert wird.

    EDIT2:
    Das ganze scheint sich auf den Trigger zu beziehen. Vermute da muss ich ohne Hilfe durch.

    EDIT3:
    Trigger funktioniert (falls es überhaupt jemanden interessiert :D )
     
  11. RedFerret

    RedFerret Benutzer

    Stehe vor meinem nächsten Rätsel.

    Ich möchte, wenn ich ein Produkt gelöscht habe, auch die jeweiligen Hauptanforderungen und die zu ihnen gehörenden Unteranforderungen gelöscht werden. Ich habe alle Tabellen mit Primär- und Fremdschlüsseln versehen und ON DELETE CASCADE dazu geschrieben, aber es tut sich leider nichts. Also die Einträge bleiben unverändert. Hier ist der Code meiner Tabellen:

    Code:
     
    delimiter $$
     
    CREATE TABLE `Produkte` (
      `ProduktID` int(11) NOT NULL DEFAULT '0',
      `Name` char(50) DEFAULT NULL,
      `AuslieferungsTermin` date DEFAULT NULL,
      CONSTRAINT PRIMARY KEY (`ProduktID`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1$$
     
     
    delimiter $$
     
    CREATE TABLE `HauptAnforderungen` (
      `AnforderungsID` int(11) NOT NULL DEFAULT '0',
      `AnforderungsName` char(50) DEFAULT NULL,
      `ProduktID` int(11) DEFAULT NULL,
      `MitarbeiterID` int(11) DEFAULT NULL,
      `erledigt` tinyint(1) DEFAULT NULL,
      CONSTRAINT PRIMARY KEY (`AnforderungsID`),
      CONSTRAINT `f_key_HauptAnf` FOREIGN KEY (`ProduktID`) 
      REFERENCES Produkte (ProduktID) ON UPDATE CASCADE ON DELETE CASCADE,
      CONSTRAINT `f_key_HauptAnfMitarb` FOREIGN KEY (`MitarbeiterID`)
      REFERENCES Mitarbeiter (MitarbeiterID) ON UPDATE CASCADE ON DELETE CASCADE
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1$$
     
     
    delimiter $$
     
    CREATE TABLE `UnterAnforderungen` (
      `AnforderungsID` int(11) NOT NULL DEFAULT '0',
      `AnforderungsName` char(50) DEFAULT NULL,
      `MitarbeiterID` int(11) DEFAULT NULL,
      `ZeitBedarf_Tage` int(11) DEFAULT NULL,
      `HauptAnforderungsID` int(11) DEFAULT NULL,
      `Klassifizierung` char(50) DEFAULT NULL,
      `erledigt` tinyint(1) DEFAULT NULL,
      CONSTRAINT PRIMARY KEY (`AnforderungsID`),
      CONSTRAINT `f_key_UnterAnf` FOREIGN KEY (`HauptAnforderungsID`)
      REFERENCES HauptAnforderungen (AnforderungsID) ON UPDATE CASCADE ON DELETE CASCADE,
      CONSTRAINT `f_key_Klasse` FOREIGN KEY (`Klassifizierung`)
      REFERENCES Klasse (KlassenID) ON UPDATE CASCADE ON DELETE CASCADE,
      CONSTRAINT `f_key_UnterAnfMitarb` FOREIGN KEY (`MitarbeiterID`)
      REFERENCES Mitarbeiter (MitarbeiterID) ON UPDATE CASCADE ON DELETE CASCADE
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1$$
    
     
  12. akretschmer

    akretschmer Datenbank-Guru


    Du verwendestMyISAM. Das ist, sorry, technologischer Schrott des letzten Jahrtausends. Vermutlich auch die Ursache für Deine Probleme, denn IIRC nimmt MySQL solche 'ON DELETE CASCADE' zwar an, ignoriert sie aber dann.

    Nimm InnoDB, wenn es schon MySQL sein soll. Das ist wenigstens halbwegs etwas, was man als zeitgemäße DB bezeichnen kann. Und wenn man ein Auge fest und das andere fast zudrückt. Denn auch InnoDB ist, wenn man gewisse Maßstäbe anlegt, Schrott:

    Code:
    mysql> create table bla (i int check (i < 10)) engine innodb;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> insert into bla values (9);
    Query OK, 1 row affected (0.01 sec)
    
    mysql> insert into bla values (11);
    Query OK, 1 row affected (0.00 sec)
    
    Please, what?

    Hab mal gegoogelt:

    Quelle: http://dev.mysql.com/doc/refman/5.1/de/ansi-diff-foreign-keys.html

    Also: MyISAM geht ganz und gar überhaupt nicht.



    Andreas
     
    ukulele und RedFerret gefällt das.
  13. RedFerret

    RedFerret Benutzer

    Okay, also in meinen MySQLworkbench Einstellungen steht unter Default Storage Engine eindeutig InnoDB... das ist komisch. MyISAM hatte ich auch gar nicht ausgewählt, hab es erst gesehen als ich mir die Create Statements von meinen angelegten Tabellen erzeugen lies und mir dann nichts dabei gedacht.

    Nochmals vielen vielen Dank für die Hilfe ;)
     
  14. akretschmer

    akretschmer Datenbank-Guru

    Kein Ding.

    Ich find's halt absolut FAIL, wenn eine DB Constraint-Definitionen ohne Fehler annimmt und dann ignoriert. Und das zieht sich durch MySQL wie ein roter Faden. Sowas geht gar nicht. Überhaupt nicht. Wirklich nicht.

    Andreas
     
    RedFerret gefällt das.
  15. RedFerret

    RedFerret Benutzer

    Das ist wirklich nicht sehr professionell, nicht mal eine Warnung gibts.

    Leider wird jetzt meine Tabelle UnterAnforderung nicht mehr erstellt. Das hier hab ich im Manual gefunden:


    1005 (ER_CANT_CREATE_TABLE)
    Tabelle kann nicht angelegt werden. Wenn die Fehlermeldung auf errno 150 verweist, schlug die Tabellenerzeugung fehl, weil ein Fremdschlüssel-Constraint nicht richtig gebildet wurde.

    allerdings kann ich beim besten Willen keinen Fehler entdecken. Hier mal der Code aller Tabellen:
    Code:
    [/SIZE][/FONT][/COLOR]
     
    delimiter $$
     
    CREATE TABLE `Mitarbeiter` (
      `MitarbeiterID` int(11) NOT NULL DEFAULT '0',
      `MitarbeiterVorname` char(50) DEFAULT NULL,
      `MitarbeiterNachname` char(50) DEFAULT NULL,
      CONSTRAINT PRIMARY KEY (`MitarbeiterID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1$$
     
     
     
     
     
    delimiter $$
     
    CREATE TABLE `Klassen` (
      `KlassenID` int(11) NOT NULL DEFAULT '0',
      `KlassenName` char(50) DEFAULT NULL,
      CONSTRAINT PRIMARY KEY (`KlassenID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1$$
     
     
     
     
     
    delimiter $$
     
    CREATE TABLE `Produkte` (
      `ProduktID` int(11) NOT NULL DEFAULT '0',
      `Name` char(50) DEFAULT NULL,
      `AuslieferungsTermin` date DEFAULT NULL,
      CONSTRAINT PRIMARY KEY (`ProduktID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1$$
     
     
     
     
     
    delimiter $$
     
    CREATE TABLE `HauptAnforderungen` (
      `AnforderungsID` int(11) NOT NULL DEFAULT '0',
      `AnforderungsName` char(50) DEFAULT NULL,
      `ProduktID` int(11) DEFAULT NULL,
      `MitarbeiterID` int(11) DEFAULT NULL,
      `erledigt` tinyint(1) DEFAULT NULL,
      CONSTRAINT PRIMARY KEY (`AnforderungsID`),
      CONSTRAINT `f_key_HauptAnf` FOREIGN KEY (`ProduktID`) 
      REFERENCES Produkte (ProduktID) ON UPDATE CASCADE ON DELETE CASCADE,
      CONSTRAINT `f_key_HauptAnfMitarb` FOREIGN KEY (`MitarbeiterID`)
      REFERENCES Mitarbeiter (MitarbeiterID)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1$$
     
     
     
     
    delimiter $$
     
    CREATE TABLE `UnterAnforderungen` (
      `AnforderungsID` int(11) NOT NULL DEFAULT '0',
      `AnforderungsName` char(50) DEFAULT NULL,
      `MitarbeiterID` int(11) DEFAULT NULL,
      `ZeitBedarf_Tage` int(11) DEFAULT NULL,
      `HauptAnforderungsID` int(11) DEFAULT NULL,
      `Klassifizierung` char(50) DEFAULT NULL,
      `erledigt` tinyint(1) DEFAULT NULL,
      CONSTRAINT PRIMARY KEY (`AnforderungsID`),
      CONSTRAINT `f_key_UnterAnf` FOREIGN KEY (`HauptAnforderungsID`)
      REFERENCES HauptAnforderungen (AnforderungsID) ON UPDATE CASCADE ON DELETE CASCADE,
      CONSTRAINT `f_key_Klasse` FOREIGN KEY (`Klassifizierung`)
      REFERENCES Klasse (KlassenID) ON UPDATE CASCADE ON DELETE CASCADE,
      CONSTRAINT `f_key_UnterAnfMitarb` FOREIGN KEY (`MitarbeiterID`)
      REFERENCES Mitarbeiter (MitarbeiterID)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1$$
     
    [SIZE=14px][FONT=Helvetica][COLOR=#000000]
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden