Saya telah membuat prosedur tersimpan di mysql menggunakan sintaks berikut.
DROP PROCEDURE IF EXISTS `sp-set_comment_count`;
DELIMITER $$
CREATE PROCEDURE `sp_set-comment_count` (IN _id INT)
BEGIN
-- AC - AllCount
DECLARE AC INT DEFAULT 0;
SELECT COUNT(*) AS ac
INTO AC
FROM usergroups AS ug
LEFT JOIN usergroup_comments AS ugm ON ugm.`gid` = ug.`id`
LEFT JOIN mediagallery AS dm ON ugm.mid = dm.`id`
WHERE dm.`status` NOT IN (200, 201, 202, 203, 204, 205)
AND ug.`id` = _id;
UPDATE usergroups
SET allCount = AC,
WHERE usergroups.`id` = _id;
END $$
DELIMITER ;
FYI Saya sudah sangat menyederhanakan prosedur tersimpan tetapi saya tahu ini bekerja tanpa masalah.
Yang ingin saya lakukan adalah menyiapkan pemicu dari usergroup_comments yang berfungsi seperti ini.
DROP TRIGGER IF EXISTS `usergroups_comments_insert`
CREATE TRIGGER `usergroups_comments_insert` AFTER INSERT ON `usergroups_comment`
FOR EACH ROW
BEGIN
CALL sp-set-comment_count(NEW.`gid`);
END;
Tetapi untuk beberapa alasan setiap kali saya melakukan mysql melempar kesalahan pada saya yang kurang membantu menyatakan bahwa ada kesalahan sintaks pada baris 4.
Saya telah menyisir dokumentasi mysql dan menemukan beberapa informasi tentang batasan pemicu tetapi ternyata cukup berbelit-belit.
http://dev.mysql.com/doc/refman/5.1/en/stored-program-restrictions.html
Setiap ide akan sangat membantu.
mysql
stored-procedures
trigger
Markus D
sumber
sumber
Jawaban:
Ada alasan bagus mengapa Anda tidak boleh menyebut prosedur tersimpan dari dalam pemicu.
Pemicu pada dasarnya adalah prosedur tersimpan. Tindakan mereka sebenarnya sulit untuk dibatalkan . Bahkan jika semua tabel yang mendasari adalah InnoDB, Anda akan mengalami volume proporsional kunci baris bersama dan intermittency yang mengganggu dari kunci baris eksklusif. Ini akan menjadi kasus jika pemicu memanipulasi tabel dengan INSERT dan UPDATE sedang mandek untuk melakukan tugas berat MVCC di dalam setiap panggilan ke pemicu .
Jangan lupa bahwa Pemicu membutuhkan overhead. Padahal, menurut Pemrograman Prosedur yang Disimpan MySQL , halaman 256 di bawah kepala "Trigger Overhead" mengatakan yang berikut:
Penjelasan lebih lanjut tentang overhead pemicu diberikan pada halaman 529-531. Titik penutup dari bagian itu menyatakan sebagai berikut:
Saya menjelaskan aspek-aspek buruk lain dari Pemicu dalam posting sebelumnya.
RINGKASAN
Saya sangat merekomendasikan untuk tidak memanggil prosedur tersimpan dari Pemicu , bahkan jika MySQL mengizinkannya. Anda harus memeriksa pembatasan saat ini untuk MySQL 5.5 .
sumber
Jadi ternyata ini adalah masalah yang mengganggu saya selama beberapa jam, percaya atau tidak.
Saya dapat dengan mudah mendefinisikan prosedur yang disebut, sp_set-comment_count. Namun ketika memanggil prosedur tersebut, itu tidak bekerja dengan cara yang sama.
CALL sp_set-comment_count (Saya hanya dapat berasumsi ini karena server mengartikan - sebagai minus).
Sejak itu saya mengubah nama prosedur tersimpan untuk hanya menggunakan garis bawah dan sepertinya telah menyelesaikan semuanya.
sumber
CALL `sp-set-comment_count`(NEW.`gid`);
Jika dikatakan tentang kesalahan sintaksis, kemungkinan besar Anda lupa mengubah pembatas (seperti yang Anda lakukan untuk prosedur tersimpan). Jadi kamu butuh
sumber
Sepertinya koma setelahnya
AC
adalah kesalahan sintaksis:sumber