سؤال

لقد سمعت عن المحفزات، ولدي بعض الأسئلة.
ما هي المحفزات؟
كيف أقوم بإعدادهم؟
هل هناك أي احتياطات ينبغي اتخاذها، بخلاف عناصر SQL النموذجية؟

هل كانت مفيدة؟

المحلول

تسمح لك المشغلات بتنفيذ وظيفة في قاعدة البيانات عند حدوث أحداث معينة (على سبيل المثال، إدراج في جدول).

لا أستطيع التعليق على الخلية على وجه التحديد.

الاحتياطات:يمكن أن تكون المحفزات مغرية جدًا، فعندما تبدأ في استخدامها لأول مرة تبدو وكأنها رصاصة سحرية لجميع أنواع المشكلات.لكنها تجعل الأشياء "السحرية" تحدث، إذا كنت لا تعرف قاعدة البيانات من الداخل إلى الخارج، فقد يبدو الأمر وكأن أشياء غريبة حقًا تحدث (مثل الإدراج في جداول أخرى، وتغيير بيانات الإدخال، وما إلى ذلك).قبل تنفيذ الأشياء كمحفز، سأفكر بجدية بدلاً من ذلك في فرض استخدام واجهة برمجة التطبيقات (API) حول المخطط (يفضل أن يكون ذلك في قاعدة البيانات، ولكن خارجها إذا لم تتمكن من ذلك).

بعض الأشياء التي ما زلت أستخدم المشغلات لها

  • تتبع حقلي "تاريخ_الإنشاء" و"تاريخ_آخر_تحرير".
  • إدراج "المعرف" (في أوراكل، حيث لا يوجد حقل معرف تلقائي)
  • حفظ تاريخ التغيير

الأشياء التي لا تريد استخدام المشغلات من أجلها

  • قواعد العمل / المنطق
  • أي شيء يتصل خارج قاعدة البيانات (على سبيل المثال، مكالمة خدمة ويب)
  • صلاحية التحكم صلاحية الدخول
  • أي شيء ليس يتعلق بالمعاملات (أي شيء تفعله في المشغل يجب أن يكون قادرًا على التراجع عن المعاملة)

نصائح أخرى

من dev.mysql.com, ، الزناد هو

... كائن قاعدة بيانات مسمى مرتبط بجدول ويتم تنشيطه عندما يحدث حدث معين للجدول.

بناء الجملة لإنشائها تم توثيقه أيضًا في هذا الموقع.

باختصار،

CREATE
    [DEFINER = { user | CURRENT_USER }]
    TRIGGER trigger_name trigger_time trigger_event
    ON tbl_name FOR EACH ROW trigger_stmt

ويضربون مثالا:

CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
CREATE TRIGGER ins_sum BEFORE INSERT ON account FOR EACH ROW SET @sum = @sum + NEW.amount;

عليك على الأقل الالتزام بها جميع القيود المفروضة على الوظائف المخزنة.لن تتمكن من قفل الجداول أو تغيير طرق العرض أو تعديل الجدول الذي أدى إلى تشغيل المشغل.يثير أيضا قد يسبب مشاكل النسخ المتماثل.

المشغل هو كائن قاعدة بيانات مسمى مقترن بجدول ويتم تنشيطه عند وقوع حدث معين للجدول.

لإنشاء مشغل:

CREATE TRIGGER triggerName [BEFORE|AFTER] [INSERT|UPDATE|DELETE|REPLACE] ON tableName FOR EACH ROW SET stuffToDoHERE;


وعلى الرغم من أنني أجبت على هذا الجزء فإن السؤال الآخر لا يزال قائما.

هذا السؤال قديم والإجابات الأخرى جيدة جدًا، ولكن بما أن المستخدم سأل عن الاحتياطات التي يجب اتخاذها، فأنا أريد إضافة شيء:

  • إذا كنت تستخدم النسخ المتماثل في بيئة معقدة، فلا تستخدم المشغلات بشكل مكثف، ولا تستدعي الإجراءات المخزنة من المشغلات.
  • المشغلات بطيئة في MySQL.
  • لا يمكنك استخدام بعض عبارات SQL ضمن المشغلات.وبعض العبارات مسموح بها ولكن يجب تجنبها، مثل LOCK.القاعدة العامة هي:إذا كنت لا تفهم تمامًا الآثار المترتبة على ما تفعله، فلا ينبغي عليك القيام بذلك.
  • يمكن أن تسبب المشغلات حلقات لا نهاية لها، لذا كن حذرًا.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top