একটি ট্রিগার থেকে একটি সঞ্চিত পদ্ধতি কল করুন


17

আমি নিম্নলিখিত সিনট্যাক্সটি ব্যবহার করে মাইএসকিএলে একটি সঞ্চিত পদ্ধতি তৈরি করেছি।

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 ;

এফওয়াইআই আমি সঞ্চিত প্রক্রিয়াটি ব্যাপকভাবে সহজ করে দিয়েছি তবে আমি জানি এটি কোনও সমস্যা ছাড়াই কাজ করে।

আমি যা করতে সক্ষম হতে চাই তা হ'ল ব্যবহারকারীর গোষ্ঠী_কমেন্টগুলি থেকে ট্রিগার সেট করা যা এই জাতীয় কাজ করে।

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;

তবে কিছু কারণে প্রতিবার যখন আমি মাইএসকিএল করি তখন আমার কাছে একটি ত্রুটি নিক্ষেপ হয় যেটি 4 লাইনটিতে একটি বাক্য গঠন ত্রুটি রয়েছে বলে সহায়ক হিসাবে কম নয়।

আমি মাইএসকিএল ডকুমেন্টেশনের মাধ্যমে ঝুঁকি নিয়েছি এবং ট্রিগারগুলির সীমাবদ্ধতার বিষয়ে কিছু তথ্য খুঁজে পেয়েছি তবে এটি মোটামুটি সংশ্লেষিত বলে মনে হয়েছে।

http://dev.mysql.com/doc/refman/5.1/en/stored-program-restrictions.html

কোন ধারনা সহায়ক হবে।


সুতরাং এটি উপরের সঞ্চিত প্রক্রিয়াটির সাথে সমস্যাটি দেখা দেয় এটি হ'ল এটির নামে এটি একটি হাইফেন ছিল। সঞ্চিত প্রক্রিয়াটির নামটি sp_set_comment_count এ পরিবর্তন করা সমস্যার সমাধান করেছে।
ডি

উত্তর:


24

আপনার কখনই ট্রিগারগুলির মধ্যে থেকে সঞ্চিত প্রক্রিয়া কল করা উচিত নয় তার দুর্দান্ত কারণ রয়েছে।

ট্রিগারগুলি প্রকৃতির দ্বারা সঞ্চিত প্রক্রিয়া। তাদের ক্রিয়াকলাপগুলি কার্যত ফিরে আসা শক্ত । এমনকি যদি সমস্ত অন্তর্নিহিত টেবিলগুলি ইনোডিবি হয় তবে আপনি ভাগ করে নেওয়া সারি লকগুলির একটি আনুপাতিক ভলিউম এবং একচেটিয়া সারি লকগুলি থেকে বিরক্তিকর বিরতিতে অভিজ্ঞতা অর্জন করতে পারেন। যদি ট্রিগাররা প্রতিটি কলের মধ্যে ভারী শুল্ক এমভিসিসি সঞ্চালনের জন্য ইনসার্ট এবং আপডেটের সাথে সারণীগুলিতে হেরফের করে থাকে তবে এরকম হবে ।

ভুলে যাবেন না যে ট্রিগারদের ওভারহেডের প্রয়োজন। প্রকৃতপক্ষে, মাইএসকিউএল স্টোরেড প্রক্রিয়া প্রোগ্রামিং অনুসারে , "ট্রিগার ওভারহেড" শিরোনামের 256 পৃষ্ঠায় নিম্নলিখিতটি বলেছেন:

এটি মনে রাখা জরুরী যে প্রয়োজন অনুসারে, ট্রিগারগুলি ডিএমএল বিবৃতিতে ওভারহেড যুক্ত করে যা তারা প্রয়োগ করে। ওভারহেডের প্রকৃত পরিমাণটি ট্রিগারটির প্রকৃতির উপর নির্ভর করবে, তবে --- যেহেতু সমস্ত মাইএসকিউএল ট্রিগার প্রতিটি সারি জন্য নির্বাহ করে --- ওভারহেড দ্রুত বিবরণীর জন্য জমা হতে পারে যা প্রচুর পরিমাণে সারি প্রক্রিয়াকরণ করে। সুতরাং আপনার ট্রিগারগুলিতে কোনও ব্যয়বহুল এসকিউএল বিবৃতি বা পদ্ধতিগত কোড স্থাপন করা এড়ানো উচিত।

ট্রিগার ওভারহেডের একটি বিস্তৃত ব্যাখ্যা 529-531 পৃষ্ঠায় দেওয়া হয়েছে। বিভাগটি থেকে সমাপ্তি পয়েন্টটি নিম্নলিখিতটি বলে:

এখানে পাঠটি হ'ল: যেহেতু ডিএমএল স্টেটমেন্ট দ্বারা আক্রান্ত প্রতিটি সারির জন্য ট্রিগার কোড একবার কার্যকর করা হবে, তাই ট্রিগারটি সহজেই ডিএমএল কার্য সম্পাদনের সবচেয়ে গুরুত্বপূর্ণ উপাদান হয়ে উঠতে পারে। ট্রিগার বডিটির অভ্যন্তরের কোডটি যতটা সম্ভব হালকা ওজনের হওয়া দরকার এবং - বিশেষত - ট্রিগারটিতে থাকা কোনও এসকিউএল বিবৃতি যখনই সম্ভব সূচকগুলি দ্বারা সমর্থন করা উচিত।

আমি আগের পোস্টে ট্রিগারগুলির অন্যান্য বাজে দিকগুলি ব্যাখ্যা করেছি।

সারসংক্ষেপ

আমি দৃ strongly়ভাবে সুপারিশ করব কোনও ট্রিগার থেকে কোনও সঞ্চিত প্রক্রিয়া কল না করা , এমনকি মাইএসকিউএল এটির অনুমতি দিলেও । আপনার মাইএসকিউএল 5.5 এর জন্য বর্তমান বিধিনিষেধগুলি পরীক্ষা করে দেখানো উচিত


আকর্ষণীয়, মাথা আপ জন্য ধন্যবাদ। আমাদের পরিবেশে লেনদেনের অনুসন্ধানের অভাব লেনদেনের সমস্যাটিকে প্রশমিত করে। তবে আমি ওভারহেড জমে থাকা ধারণাটির প্রশংসা করতে পারি। আমার ধারণা এই পরিবর্তনটির ফলাফল কী তা দেখার জন্য আমি ডিবিটি কিছুক্ষণ দেখব।
মার্ক ডি

আমি মনে করি না এটি সঞ্চিত প্রক্রিয়াগুলির সাথে ট্রিগারগুলির মোকাবিলা করা সঠিক। সর্বনিম্ন, এটি কোনও সঞ্চিত পদ্ধতিতে লেনদেন শুরু এবং প্রতিশ্রুতিবদ্ধ বৈধ। মাইএসকিউএল অভিযোগ করে আপনি যদি ট্রিগারটিতেও একই কাজ করার চেষ্টা করেন। যা নির্বোধ, কারণ কিছু পরিবর্তনের প্রতিক্রিয়াতে একটি বা একাধিক টেবিল লেনদেনের জন্য আপডেট করতে হবে এমন একটি ট্রিগার থাকা সম্পূর্ণ বৈধ ব্যবহার-কেস যা সোজা পদ্ধতিতে সমর্থন করা উচিত।
আরথ

সুতরাং আমি এই ট্রিগার আছে, এটি সত্যিই বড়। এটি সারণি এবং আপডেট উভয়ই আমার টেবিলটিতে বেশ কয়েকটি গণনা সম্পাদন করে। মাইএসকিএল-এ ট্রিগাররা জটিল হলে সত্যই বেদনাদায়ক হয়ে উঠতে পারে। প্রক্রিয়াগুলিতে ট্রিগারটি ভেঙে ফেলা আরও সহজ হবে।
লামার

8

সুতরাং দেখা যাচ্ছে যে এই সমস্যাটি আমাকে কয়েক ঘন্টার জন্য জর্জরিত করেছে এটি বিশ্বাস করুন বা না করুন।

আমি সহজেই, sp_set-Comment_count নামক একটি পদ্ধতিটি নির্ধারণ করতে পারি। যাইহোক কল করার সময় প্রক্রিয়াটি বলার সময়, এটি একইভাবে কাজ করে না।

কল করুন এসপি_সেট-মন্তব্য_কাউন্ট (আমি কেবল এটি ধরে নিতে পারি কারণ সার্ভারটি - বিয়োগ হিসাবে ব্যাখ্যা করে)।

আমি তখন থেকে সঞ্চিত প্রক্রিয়াটির নামটি কেবলমাত্র আন্ডারস্কোরগুলি ব্যবহার করতে পরিবর্তিত করেছি এবং মনে হয় এটি সবকিছু সমাধান করেছে।


পার্টিতে দেরীতে কিন্তু: আপনি উদ্ধৃত শনাক্তকারী ব্যবহার করে আপনার এসপি তৈরি করেছেন, যা এর নামে বিশেষ অক্ষরগুলিকে অনুমতি দিয়েছে, তাই আপনার অন্যত্র এটি একইভাবে উল্লেখ করা উচিত:CALL `sp-set-comment_count`(NEW.`gid`);
মোস্তাকাসিও

5

যদি এটি সিনট্যাক্স ত্রুটির বিষয়ে বলে, সম্ভবত আপনি ডিলিমিটার পরিবর্তন করতে ভুলে গেছেন (যেমন আপনি সঞ্চিত পদ্ধতির জন্য করেছিলেন)। সুতরাং আপনার প্রয়োজন

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

আপনাকে ধন্যবাদ ধন্যবাদ এটি আমাকে সত্যিকারের ট্র্যাকের সাথে ভাবতে পেরেছিল। আসলে আমার এসপিকে এসপি-সেট_কমেন্ট_কাউন্ট বলা হত। ট্রিগার দ্বারা ডেকে এলে মনে হয় সমস্যাটি হ'ল এসপিটিকে ট্রিগার থেকে কল করার সময় - ত্রুটি নিক্ষেপ করতে থাকল।
মার্ক ডি

1

কমা পরে মনে হচ্ছে ACসিনট্যাক্স ত্রুটি:

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

বৈধ পয়েন্ট, তবে এই ক্ষেত্রে ত্রুটির প্রকৃত কারণ নয় আমি কেবল query কোয়েরিটি থেকে কিছু অতিরিক্ত সেট ছাঁটাই করেছি এবং মুছে ফেলতে ভুলে গেছি,
মার্ক ডি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.