সন্নিবেশ এবং আপডেট উভয়ের জন্য মাইএসকিউএল ফায়ার ট্রিগার


111

কোনও টেবিলের সন্নিবেশ এবং আপডেটের উভয়টির জন্য কি মাইএসকিএল ট্রিগার চালানো সম্ভব?

আমি জানি আমি নিম্নলিখিতগুলি করতে পারি

CREATE TRIGGER my_trigger
    AFTER INSERT ON `table`
    FOR EACH ROW
BEGIN
.....
END //

CREATE TRIGGER my_trigger
    AFTER UPDATE ON `table`
    FOR EACH ROW
BEGIN
.....
END //

তবে কীভাবে করব

CREATE TRIGGER my_trigger
    AFTER INSERT ON `table` AND
    AFTER UPDATE ON `table`
    FOR EACH ROW
BEGIN
.....

এটি কি সম্ভব, না আমার 2 টি ট্রিগার ব্যবহার করতে হবে? কোড উভয়ের জন্য একই এবং আমি এটির পুনরাবৃত্তি করতে চাই না।

উত্তর:


126

আপনাকে দুটি ট্রিগার তৈরি করতে হবে, তবে আপনি সাধারণ কোডটি একটি পদ্ধতিতে স্থানান্তর করতে পারেন এবং উভয়কেই পদ্ধতিটি কল করতে পারেন।


3
আমরা যারা সিনট্যাক্সের সাথে অপরিচিত তাদের জন্য আপনি কি এর খেলনার উদাহরণ দিতে পারেন?
জেডএওস

3
@ জক্সাওস: আমি dev.mysql.com/doc/refman/5.1/en/create-procedure.html (যার কয়েকটি উদাহরণ রয়েছে) দিয়ে শুরু করার এবং প্রয়োজনে নিজের প্রশ্ন (গুলি) জিজ্ঞাসা করার পরামর্শ দেব ।
ডারোবার্ট

2
এটি অত্যন্ত দুঃখের বিষয় যা আমরা ওরাকল-এর মতো এবং / বা অপারেটরগুলি ব্যবহার করতে পারি না, তারপরেও যখন আমরা কোনও প্যারামিটারের সাহায্যে পুরো ভেরিয়েবলগুলি ওএলডি এবং নতুন ব্যবহার করতে পারি না। আমার কোডটি> 2x
মিকেল

এটি এমন বিকাশকারীদের পক্ষে দরকারী যিনি কখনই কোনও কোড লিখতে কখনও দু'বার আপস করেন না ..
সায়কা

1
@ লুইস্মার্টিংয়ে সম্ভবত কোনও পদ্ধতিটি ইনলাইন করে কল করার কিছু অতিরিক্ত ওভারহেড রয়েছে। তবে বিনিময়ে আপনি আরও সহজ রক্ষণাবেক্ষণ এবং গ্যারান্টি পাবেন যে দুটি ট্রিগার কোডটি দুর্ঘটনাক্রমে অন্যদিকে পরিবর্তন ঘটবে না।
ডারোবার্ট

46

@ জেডএক্স অনুরোধের প্রতিক্রিয়া হিসাবে, যেহেতু আপনার কোড থেকে শুরু করে মাইএসকিউএল ট্রিগারগুলির জন্য আমাদের কাছে ও / ওআর অপারেটর থাকতে পারে না, এটি অর্জনের জন্য নীচে একটি সম্পূর্ণ উদাহরণ।

1. INSERT ট্রিগার সংজ্ঞা দিন:

DELIMITER //
DROP TRIGGER IF EXISTS my_insert_trigger//
CREATE DEFINER=root@localhost TRIGGER my_insert_trigger
    AFTER INSERT ON `table`
    FOR EACH ROW

BEGIN
    -- Call the common procedure ran if there is an INSERT or UPDATE on `table`
    -- NEW.id is an example parameter passed to the procedure but is not required
    -- if you do not need to pass anything to your procedure.
    CALL procedure_to_run_processes_due_to_changes_on_table(NEW.id);
END//
DELIMITER ;

2. আপডেট আপডেট ট্রিগার সংজ্ঞা

DELIMITER //
DROP TRIGGER IF EXISTS my_update_trigger//

CREATE DEFINER=root@localhost TRIGGER my_update_trigger
    AFTER UPDATE ON `table`
    FOR EACH ROW
BEGIN
    -- Call the common procedure ran if there is an INSERT or UPDATE on `table`
    CALL procedure_to_run_processes_due_to_changes_on_table(NEW.id);
END//
DELIMITER ;

৩. এই উভয় ট্রিগার দ্বারা ব্যবহৃত সাধারণ পদ্ধতিটি সংজ্ঞায়িত করুন:

DELIMITER //
DROP PROCEDURE IF EXISTS procedure_to_run_processes_due_to_changes_on_table//

CREATE DEFINER=root@localhost PROCEDURE procedure_to_run_processes_due_to_changes_on_table(IN table_row_id VARCHAR(255))
READS SQL DATA
BEGIN

    -- Write your MySQL code to perform when a `table` row is inserted or updated here

END//
DELIMITER ;

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


1
কি IN table_row_id VARCHAR(255)এই ক্ষেত্রে? মানে আপনি কীভাবে সংজ্ঞা দিচ্ছেন কোন সারিটি sertedোকানো বা আপডেট হতে চলেছে?
ভ্যাটো

13

দুর্ভাগ্যক্রমে আমরা মাইএসকিউএলে INSERT বা আপডেট আপডেটের পরে ওরাকলের মতো ব্যবহার করতে পারি না

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.