cyclo Δημοσ. 14 Νοεμβρίου 2011 Δημοσ. 14 Νοεμβρίου 2011 γεια χαρά=) λοιπόν, έχουμε τον ακόλουθο πίνακα: cmscore_Classes θέλω να φτιάξω ένα trigger σε άλλο πίνακα, ο οποίος θα διαβάζει το InheritanceCollection σύμφωνα με new.ClassID και στη συνέχεια θα δημιουργεί τα ανάλογα records στα core tables τα οποία ισχύει η ψευδο-κληρονομικότητα. δηλαδή... DELIMITER $$ CREATE TRIGGER InsertItem AFTER INSERT ON cmscore_Items FOR EACH ROW BEGIN select ClassInheritance from cmscore_Classes where ClassID = new.ClassID κάνε τα κόλπα σου και κάνε inserts ανάλογα με το ClassInheritance END; $$ για παράδειγμα... αν εγώ βάλω μία εγγραφή στον cmscore_Items με ClassID=5, η οποία έχει ClassInheritance "1,2,5" θα πρέπει να μου γράψει στους πίνακες: cmscore_Items, cmscore_Images εαν εγώ βάλω μια εγγραφή στον cmscore_Items με ClassID=3, η οποία έχει ClassInheritance "1,2,3," θα πρέπει να μου γράψει στους πίνακες: cmscore_Items, cmscore_Images, cmscore_Documents προς το παρόν δουλεύω με if (ClassId = 1) then insert into tade else if ( classid=2) kai παει λέγοντας... πράγμα που χρειάζεται συνεχώς συντήρηση, και είναι κάτι που θέλω να το κάνω γενικό=)
MitsakosGR Δημοσ. 15 Νοεμβρίου 2011 Δημοσ. 15 Νοεμβρίου 2011 (επεξεργασμένο) Δοκίμασε να φτιάχνεις δυναμικά το insert κάθε φορά μέσα στο trigger. Θα παίρνεις με select το tableName και θα το βάζεις σε μία μεταβλητή ώστε να το φτιάξεις σαν ερώτημα για insert. >SET @dyn_sql=CONCAT("INSERT INTO ", @dynamicTable," VALUES (" @dynamicValues ")"); PREPARE s1 from @dyn_sql; EXECUTE s1; > DELIMITER $$ CREATE PROCEDURE `test_proc`( IN varClassID INT) BEGIN DECLARE tableName VARCHAR(50); DECLARE Inheritance VARCHAR(50); DECLARE CurrentID INT; DECLARE ins_query VARCHAR(500); DECLARE pos INT DEFAULT 1; DECLARE nextPos INT DEFAULT 0; #Read the inheritance record SELECT InheritanceCollection INTO Inheritance FROM cmscore_Classes WHERE ClassID = varClassID; find_inheritance: LOOP #Briskoume to epomeno comma SELECT LOCATE(',', Inheritance, pos) INTO nextPos; #An epistrepsei 0 tote einai h teleytaia IF nextPos = 0 THEN #Epilegei to teleytaio noumero tou Inheritance SELECT CAST(SUBSTRING(Inheritance FROM pos) AS DECIMAL) INTO CurrentID; ELSE #Epilegei to epomeno noumero tou Inheritance SELECT CAST(SUBSTRING(Inheritance FROM pos FOR (nextPos - pos)) AS DECIMAL) INTO CurrentID; END IF; #Briskei apo to inheritance to onoma tou pinaka SELECT cms_Table INTO tableName FROM cmscore_Classes WHERE ClassID = CurrentID; #Dhmiourgoume kai trexoume to insert query SET @ins_query = CONCAT("INSERT INTO `test`.`", tableName, "` (`Data`) VALUES('",tableName,"');"); PREPARE s1 FROM @ins_query; EXECUTE s1; #An einai 0 shmainei oti ekane kai to teleytaio opote feygei apo to loop IF nextPos = 0 THEN LEAVE find_inheritance; END IF; SET pos = nextPos + 1; # END LOOP; DEALLOCATE PREPARE s1; END Επεξ/σία 16 Νοεμβρίου 2011 από MitsakosGR
cyclo Δημοσ. 16 Νοεμβρίου 2011 Μέλος Δημοσ. 16 Νοεμβρίου 2011 Δοκίμασε να φτιάχνεις δυναμικά το insert κάθε φορά μέσα στο trigger. Θα παίρνεις με select το tableName και θα το βάζεις σε μία μεταβλητή ώστε να το φτιάξεις σαν ερώτημα για insert. >SET @dyn_sql=CONCAT("INSERT INTO ", @dynamicTable," VALUES (" @dynamicValues ")"); PREPARE s1 from @dyn_sql; EXECUTE s1; > DELIMITER $$ CREATE PROCEDURE `test_proc`( IN varClassID INT) BEGIN DECLARE tableName VARCHAR(50); DECLARE Inheritance VARCHAR(50); DECLARE CurrentID INT; DECLARE ins_query VARCHAR(500); DECLARE pos INT DEFAULT 1; DECLARE nextPos INT DEFAULT 0; #Read the inheritance record SELECT InheritanceCollection INTO Inheritance FROM cmscore_Classes WHERE ClassID = varClassID; find_inheritance: LOOP #Briskoume to epomeno comma SELECT LOCATE(',', Inheritance, pos) INTO nextPos; #An epistrepsei 0 tote einai h teleytaia IF nextPos = 0 THEN #Epilegei to teleytaio noumero tou Inheritance SELECT CAST(SUBSTRING(Inheritance FROM pos) AS DECIMAL) INTO CurrentID; ELSE #Epilegei to epomeno noumero tou Inheritance SELECT CAST(SUBSTRING(Inheritance FROM pos FOR (nextPos - pos)) AS DECIMAL) INTO CurrentID; END IF; #Briskei apo to inheritance to onoma tou pinaka SELECT cms_Table INTO tableName FROM cmscore_Classes WHERE ClassID = CurrentID; #Dhmiourgoume kai trexoume to insert query SET @ins_query = CONCAT("INSERT INTO `test`.`", tableName, "` (`Data`) VALUES('",tableName,"');"); PREPARE s1 FROM @ins_query; EXECUTE s1; #An einai 0 shmainei oti ekane kai to teleytaio opote feygei apo to loop IF nextPos = 0 THEN LEAVE find_inheritance; END IF; SET pos = nextPos + 1; # END LOOP; DEALLOCATE PREPARE s1; END mhtsakos σε ευχαριστώ για την απάντηση, όμως έτσι το είχα και εγώ στην αρχή. το πρόβλημα είναι ότι η mysql δεν σε αφήνει να εκτελέσεις Dynamic Sql μέσα σε trigger ουτε να καλέσεις Stored procedure η οποία εκτελεί Dynamic Sql ψάχνω κάτι πιο ευέλικτο ακόμα, και αν γίνεται να βρίσκεται μέσα στον trigger. ευχαριστώ
MitsakosGR Δημοσ. 17 Νοεμβρίου 2011 Δημοσ. 17 Νοεμβρίου 2011 mhtsakos σε ευχαριστώ για την απάντηση, όμως έτσι το είχα και εγώ στην αρχή. το πρόβλημα είναι ότι η mysql δεν σε αφήνει να εκτελέσεις Dynamic Sql μέσα σε trigger ουτε να καλέσεις Stored procedure η οποία εκτελεί Dynamic Sql ψάχνω κάτι πιο ευέλικτο ακόμα, και αν γίνεται να βρίσκεται μέσα στον trigger. ευχαριστώ Αυτή τη λεπτομέρεια για την mysql δεν την ήξερα. Δεν ξέρω πως μπορείς να το κάνεις αυτό. ΘΑ το ψάξω λίγο ακόμα και αν βρω κάτι θα σου απαντήσω.
MitsakosGR Δημοσ. 17 Νοεμβρίου 2011 Δημοσ. 17 Νοεμβρίου 2011 Δεν μπορώ να βρω κάποιο τρόπο να ξεπεραστεί αυτό το εμπόδιο του dynamic sql σε triggers... :S Όπου και να ψάξω λέει ότι απλά δεν υποστηρίζεται... Σε κάθε trigger θα πρέπει να βάλεις τα insert στα inherited tables χωριστά.
cyclo Δημοσ. 18 Νοεμβρίου 2011 Μέλος Δημοσ. 18 Νοεμβρίου 2011 Δεν μπορώ να βρω κάποιο τρόπο να ξεπεραστεί αυτό το εμπόδιο του dynamic sql σε triggers... :S Όπου και να ψάξω λέει ότι απλά δεν υποστηρίζεται... Σε κάθε trigger θα πρέπει να βάλεις τα insert στα inherited tables χωριστά. δυστυχώς ούτε και εγώ μπόρεσα, και με συγχωρείς που σε έβαλα και έγραψες ολόκληρη stored procedure χωρίς λόγο. εν τέλει, μείωσα τα insertions από πλευράς διαχείρισης και απλά χτυπάω την stored procedure μετά απο κάθε insert. πράγμα που προσθέτει ένα μεγάλο overhead, αλλά εδώ και 2 εβδομάδες δεν εχω καταφέρει να βρω άκρη, οπότε...
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα