mysqldumper
-


Hinweise


Antwort
 
LinkBack Themen-Optionen Thema durchsuchen Thema bewerten
Alt 18.09.2007, 12:37   #1
TP-Senior
 
Registriert seit: Jun 2004
Ort: leipzig
feuervogel macht alles soweit korrekt

trigger in mysql 5.0


hallo,

ich habe eine tabelle test:

id | a | b

und ich möchte, das maximal drei gleiche einträge in der spalte b existieren. ich habe hier folgenden trigger:

DELIMITER |
DROP TRIGGER b_count_check;
CREATE TRIGGER b_count_check BEFORE INSERT ON test
FOR EACH ROW BEGIN
DECLARE amount INT;
SELECT COUNT('NEW.b') INTO amount FROM `test`;
IF amount <= 3 THEN
INSERT INTO `test` SET `a` = 'NEW.a',`b` = 'NEW.b';
END IF;
END; |

DELIMITER ;

dieser trigger wird auch ohne fehlermeldung installiert, will ich aber nun etwas einfügen, kommt folgende fehlermeldung:

ERROR 1442 (HY000): Can't update table 'test' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

wo liegt das problem?
__________________
BeCreated - Geduld und Zeit für Ihre Wünsche
feuervogel ist offline   Mit Zitat antworten


Alt 18.09.2007, 12:55   #2
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
im Bugtracker von MySQL gibts dazu folgende Anmerkung:

Zitat:
I dont think this is a bug. Its clearly stated in MySql manual under trigger limitations
that one can not select from the table on which the trigger is firing from within that
trigger.
As far as I know, this not allowed in any database, for example Oracle will generated
table mutating error under similar circumstances.
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 18.09.2007, 13:00   #3
TP-Moderator
 
Benutzerbild von Stuck Mojo
 
Registriert seit: Feb 2001
Ort: Helmstedt/Wolfsburg
Stuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKE
naja... sollte das so ablaufen, gerät das Teil doch in eine Endlosschleife, da der Trigger IMMER vor dem Insert aufgerufen wird. Es also so gesehen zu keinem wirklichen Insert kommt bis die Trigger durch sind...

Zusätzlich musst du einfach nur ein RETURN FALSE in deiner Bedingung setzten und das Ergebnis sollte passen...

Allerding denke ich, dass die NEW.b usw. in single quotes fehlerhaft sind.

...und gerade kommt Steffens Kommentar reingeflogen: Das kann natürlich auch sein :-)

Gruß
Jan
Stuck Mojo ist offline   Mit Zitat antworten
Alt 18.09.2007, 13:17   #4
TP-Senior
 
Registriert seit: Jun 2004
Ort: leipzig
feuervogel macht alles soweit korrekt
danke erstmal für die antworten, das klingt logisch.

@stuck mojo: hm, naja, so:

DELIMITER |
DROP TRIGGER b_count_check;
CREATE TRIGGER b_count_check BEFORE INSERT ON test
FOR EACH ROW BEGIN
DECLARE amount INT;
SELECT COUNT('NEW.b') INTO amount FROM `test`;
IF amount > 3 THEN
RETURN FALSE;
END IF;
END; |

DELIMITER ;

? dann erhalte ich nämlich beim erstellen des triggers das hier:

ERROR 1313 (42000) at line 2: RETURN is only allowed in a FUNCTION
__________________
BeCreated - Geduld und Zeit für Ihre Wünsche
feuervogel ist offline   Mit Zitat antworten
Alt 18.09.2007, 13:54   #5
TP-Moderator
 
Benutzerbild von Stuck Mojo
 
Registriert seit: Feb 2001
Ort: Helmstedt/Wolfsburg
Stuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKE
ach... hatte kurz in den User-Comments in dem Manual geschaut und da hatte einer genau diesen Tip gegeben... Aber andere haben dies dann doch wiederlegt. Dann passts wohl doch nicht.

Schau mal selber: http://dev.mysql.com/doc/refman/5.0/...e-trigger.html

...oder du überlegst dir einen anderen Weg.
Stuck Mojo ist offline   Mit Zitat antworten
Alt 18.09.2007, 14:10   #6
TP-Senior
 
Registriert seit: Jun 2004
Ort: leipzig
feuervogel macht alles soweit korrekt
das einzige was mir jetzt noch einfällt ist ein trigger nach dem insert der dann die zeile wieder löscht...ich war zwar in den vorlesungen datenbanksysteme 1 + 2 gar nicht mal so schlecht, aber so wirklich erinnern kann ich mich halt auch nicht mehr :-)

edit: löschen geht auch nicht, ist ja wieder die gleiche tabelle => gleiche fehlermeldung wie oben. gnarf. naja, dann gibts eben einen workaround.
__________________
BeCreated - Geduld und Zeit für Ihre Wünsche

Geändert von feuervogel (18.09.2007 um 14:18 Uhr).
feuervogel ist offline   Mit Zitat antworten
Alt 18.09.2007, 20:10   #7
TP-Senior
 
Registriert seit: Jun 2004
Ort: leipzig
feuervogel macht alles soweit korrekt
so, hier der korrektheits halber noch mal der getestete und für richtig befundene trigger:

DELIMITER |
DROP TRIGGER b_count_check;
CREATE TRIGGER b_count_check BEFORE INSERT ON test
FOR EACH ROW BEGIN
DECLARE amount INT;
SELECT COUNT(`id`) INTO amount FROM `test` WHERE `b` = NEW.b;
IF amount > 5 THEN
SET NEW.flag = 2;
END IF;
END; |

DELIMITER ;

von zeit zu weit werden die einträge mit flag = 2 gelöscht und sonst nur die mit flag < 2 genutzt. das ist jetzt mein workaround.
__________________
BeCreated - Geduld und Zeit für Ihre Wünsche
feuervogel ist offline   Mit Zitat antworten
Antwort

  Aktuelles Thema
  TP Hilfe Forum > Web-Editoren & Coding > Traum-Dynamik
trigger in mysql 5.0 trigger in mysql 5.0
« Upload mehrerer Bilder gleichzeitig | Alternative zum limit im Subselect »

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 13:03 Uhr.

Powered by: vBulletin Version 3.7 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd. / Search Engine Friendly URLs by vBSEO 3.2.0 ©2008, Crawlability, Inc.
Traum-Projekt.com | Suchen | Archiv | Impressum | Kontakt | | | Nach oben |



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67