v2.5.2
Giriş yap

Mysql karmaşık bir Trigger a ihtiyacım var

acemi
277 defa görüntülendi

Karmaşık bir trigger a ihtiyacım var kafam dolandı dolandı
bir türlü işin içinden çıkamadım.

yapmak istediklerimi sorarken bile zorluk çekiyorum yazarken nasıl yazayım :))

3 adet tablom var ilişiili
blog sütünları id, katID, resim
blog_kat sütünları id, resim
resimler id, blogID, resim

şimdi sırası ile anlatacaım çünkü kafam karışıyor sorarken bile.

1- blog_kat tablosunda bir id varsa ve silinirse blog tablosundaki katID ile eşleşenleri sil
2- 1. şıktaki işlem gerçekleşiyorsa blog tablosundaki id de silineceği için resimler tablosundaki blogID ile eşleşen tüm içerikleri sil
3- yukarıdaki 2 işlem gerçekleşirken blog_kat tablosu silinir ise /public/upload/blog/kategoi/ altındaki resim sutunu ile eşleşen ve sonu .webp ile biten resimleri dizinden sil
4- blog tablosundaki veri silirken /public/upload/blog/ altındaki resim sütünü ile eşleşen ve sonu .webp ile biten resimleridizinden sil
5 resimler tablosundaki veriler silinirken /public/upload/blog/ altındaki resim sütünü ile eşleşen ve sonu .webp ile bite resimleri dizinden sil

ben kendim söyle birşey yaptım fakat hata alıp duruyorum

DELIMITER //
CREATE TRIGGER blogkat_aitleri_sil
AFTER DELETE ON blog_kat
FOR EACH ROW
BEGIN
    DECLARE resim_id INT;
    DECLARE resim_path VARCHAR(255);
 
    DELETE FROM blog WHERE katID = OLD.id;
 
    DELETE FROM resimler WHERE blogID = OLD.id;
 
    DECLARE cur CURSOR FOR
        SELECT id, resim
        FROM resimler
        WHERE blogID IN (SELECT id FROM blog WHERE katID = OLD.id)
          AND resim LIKE '%.webp';
 
    OPEN cur;
    read_loop: LOOP
        FETCH cur INTO resim_id, resim_path;
        IF (resim_id IS NULL) THEN
            LEAVE read_loop;
        END IF;

        DELETE FROM resimler WHERE id = resim_id;

        SET @file_path = CONCAT('/public/upload/blog/kategoi/', resim_path);
 
        SET @file_delete_query = CONCAT('rm -f ', @file_path);
        PREPARE stmt FROM @file_delete_query;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END LOOP;

    CLOSE cur;
 
    DECLARE cur2 CURSOR FOR
        SELECT id, resim
        FROM resimler
        WHERE blogID = OLD.id
          AND resim LIKE '%.webp';
 
    OPEN cur2;
    read_loop2: LOOP
        FETCH cur2 INTO resim_id, resim_path;
        IF (resim_id IS NULL) THEN
            LEAVE read_loop2;
        END IF;

        DELETE FROM resimler WHERE id = resim_id;

        SET @file_path = CONCAT('/public/upload/blog/', resim_path);
 
        SET @file_delete_query = CONCAT('rm -f ', @file_path);
        PREPARE stmt FROM @file_delete_query;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END LOOP;

    CLOSE cur2;
 
    SET @file_path = CONCAT('/public/upload/blog/', OLD.resim);

    IF OLD.resim LIKE '%.webp' THEN 
        SET @file_delete_query = CONCAT('rm -f ', @file_path);
        PREPARE stmt FROM @file_delete_query;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END IF;
END //

Cevap yaz
Cevaplar (1)
acemi
536 gün önce
BEGIN 
    DELETE FROM blog WHERE katID = OLD.id; 

    DELETE resimler FROM resimler
    JOIN blog ON resimler.blogID = blog.id
    WHERE blog.katID = OLD.id;
 
    DELETE resimler FROM resimler
    JOIN blog ON resimler.blogID = blog.id
    WHERE blog.katID = OLD.id
      AND resimler.resim LIKE '%.webp';
 
    DELETE resimler FROM resimler
    WHERE blogID = OLD.id
      AND resimler.resim LIKE '%.webp';
 
    IF OLD.resim LIKE '%.webp' THEN 
        SET @file_path = CONCAT('/public/upload/blog/', OLD.resim);
        SET @file_delete_query = CONCAT('rm -f ', @file_path);
 
    END IF;
END


bu kadar bi ilelrleme kaydettim ama yine hatalar var varmı mysql bildisi tavanda olan bi fikir verseniz yeter.
teşekkürler.