Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

γεια χαρά=)

 

λοιπόν, έχουμε τον ακόλουθο πίνακα:

 

cmscore_Classes

table-data.png

 

 

θέλω να φτιάξω ένα 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 παει λέγοντας... πράγμα που χρειάζεται συνεχώς συντήρηση, και είναι κάτι που θέλω να το κάνω γενικό=)

Δημοσ. (επεξεργασμένο)

Δοκίμασε να φτιάχνεις δυναμικά το 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

Επεξ/σία από MitsakosGR
Δημοσ.

Δοκίμασε να φτιάχνεις δυναμικά το 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.

 

ευχαριστώ

Δημοσ.

mhtsakos σε ευχαριστώ για την απάντηση, όμως έτσι το είχα και εγώ στην αρχή. το πρόβλημα είναι ότι η mysql δεν σε αφήνει να εκτελέσεις Dynamic Sql μέσα σε trigger ουτε να καλέσεις Stored procedure η οποία εκτελεί Dynamic Sql :(

ψάχνω κάτι πιο ευέλικτο ακόμα, και αν γίνεται να βρίσκεται μέσα στον trigger.

ευχαριστώ

Αυτή τη λεπτομέρεια για την mysql δεν την ήξερα. Δεν ξέρω πως μπορείς να το κάνεις αυτό. ΘΑ το ψάξω λίγο ακόμα και αν βρω κάτι θα σου απαντήσω.

Δημοσ.

Δεν μπορώ να βρω κάποιο τρόπο να ξεπεραστεί αυτό το εμπόδιο του dynamic sql σε triggers... :S

Όπου και να ψάξω λέει ότι απλά δεν υποστηρίζεται...

Σε κάθε trigger θα πρέπει να βάλεις τα insert στα inherited tables χωριστά.

Δημοσ.

Δεν μπορώ να βρω κάποιο τρόπο να ξεπεραστεί αυτό το εμπόδιο του dynamic sql σε triggers... :S

Όπου και να ψάξω λέει ότι απλά δεν υποστηρίζεται...

Σε κάθε trigger θα πρέπει να βάλεις τα insert στα inherited tables χωριστά.

δυστυχώς ούτε και εγώ μπόρεσα, και με συγχωρείς που σε έβαλα και έγραψες ολόκληρη stored procedure χωρίς λόγο.

εν τέλει, μείωσα τα insertions από πλευράς διαχείρισης και απλά χτυπάω την stored procedure μετά απο κάθε insert.

 

πράγμα που προσθέτει ένα μεγάλο overhead, αλλά εδώ και 2 εβδομάδες δεν εχω καταφέρει να βρω άκρη, οπότε...

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...