it-swarm.asia

Panggil prosedur tersimpan dari pemicu

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 itu 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.

17
Mark D

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 bisa berasumsi ini karena server mengartikan - sebagai minus).

Sejak itu saya mengubah nama prosedur tersimpan untuk hanya menggunakan garis bawah dan sepertinya telah menyelesaikan semuanya.

8
Mark D

Ada alasan bagus mengapa Anda tidak boleh menyebut prosedur tersimpan dari dalam pemicu.

Pemicu, pada dasarnya, prosedur tersimpan. Tindakan mereka hampir sulit untuk dibatalkan . Bahkan jika semua tabel yang mendasari adalah InnoDB, Anda akan mengalami volume proporsional kunci baris bersama dan intermittency 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. Bahkan, Menurut Pemrograman Prosedur yang Disimpan MySQL , halaman 256 di bawah kepala "Pemicu Overhead" mengatakan yang berikut:

Penting untuk diingat bahwa, karena kebutuhan, pemicu menambah overhead pada pernyataan DML yang mereka terapkan. jumlah aktual overhead akan tergantung pada sifat pemicu, tetapi --- karena semua pemicu MySQL mengeksekusi UNTUK SETIAP BARIS --- overhead dapat dengan cepat terakumulasi untuk pernyataan yang memproses sejumlah besar baris. Karena itu Anda harus menghindari menempatkan pernyataan SQL mahal atau kode prosedural dalam pemicu.

Penjelasan lebih lanjut tentang overhead pemicu diberikan pada halaman 529-531. Poin penutup dari bagian itu menyatakan sebagai berikut:

Pelajaran di sini adalah ini: karena kode pemicu akan dieksekusi sekali untuk setiap baris yang dipengaruhi oleh pernyataan DML, pemicu dapat dengan mudah menjadi faktor paling signifikan dalam kinerja DML. Kode di dalam tubuh pemicu harus seringan mungkin dan - khususnya - pernyataan SQL apa pun dalam pemicu harus didukung oleh indeks bila memungkinkan.

Saya menjelaskan aspek-aspek jahat lainnya dari Pemicu dalam posting sebelumnya.

[~ # ~] ringkasan [~ # ~]

Saya akan sangat merekomendasikan untuk tidak memanggil prosedur tersimpan dari Pemicu , bahkan jika MySQL mengizinkannya. Anda harus memeriksa pembatasan saat ini untuk MySQL 5.5 .

24
RolandoMySQLDBA

Jika dikatakan tentang kesalahan sintaks, kemungkinan besar Anda lupa untuk mengubah pembatas (seperti yang Anda lakukan untuk prosedur tersimpan). Jadi kamu butuh

DELIMITER $$
CREATE TRIGGER `usergroups_comments_insert` AFTER INSERT ON `usergroups_comment`
FOR EACH ROW
BEGIN
   CALL sp_set_count(NEW.`gid`);
END;
$$
5
a1ex07

Sepertinya koma setelah AC adalah kesalahan sintaks:

UPDATE usergroups
   SET allCount = AC,
 WHERE ........
1
user22800