Datenbank für AnforderungsManagement

ja genau so hab ich das gemeint, allerdings benutze ich SQL. Mein Trigger müsste also so funktionieren wie bei dir die function trg_aufgabe(). Das müsste ja dann ungefähr so aussehen:

Aber ich verstehe nicht was mit count(1) gemeint ist und wie das mit new funktioniert :(

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
 
Werbung:
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"
 
Ah, da muss hauptanforderungsid rein.

Also es wurde jetzt ohne Fehlermeldung geschluckt. Ich werds mal testen ob es funktioniert.
Vielen Dank schon mal :)
 
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.
 
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.

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
 
Vielen Dank aber trotzdem.

Auf die Gefahr hin dass ich meinem Avatarbild optisch immer ähnlicher werde, probier ich heute noch ein bisschen rum.
 
Vielen Dank aber trotzdem.

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

*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
 
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 )
 
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$$
 
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:


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:

1.9.5.5. Fremdschlüssel
Ab MySQL Server 3.23.44 unterstützt die InnoDB-Speicher-Engine die Überprüfung von Fremdschlüsselbeschränkungen einschließlich CASCADE, ON DELETE und ON UPDATE. Siehe auch Abschnitt 14.2.6.4, „Fremdschlüssel-Beschränkungen“.
Bei anderen Speicher-Engines als InnoDB verarbeitet MySQL Server zwar die FOREIGN KEY-Syntax in CREATE TABLE-Anweisungen, verwendet oder speichert sie aber nicht

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

Also: MyISAM geht ganz und gar überhaupt nicht.



Andreas
 
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 ;)
 
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 ;)

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
 
Werbung:
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]
 
Zurück
Oben