Mysql karmaşık bir Trigger a ihtiyacım var
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 //
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (1)
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.