PostgreSQL المشغلات: إنشاء وإدراج وإفلات مع مثال

⚡ ملخص ذكي

PostgreSQL المشغلات هي وظائف يتم تشغيلها تلقائيًا عند حدوث حدث INSERT أو UPDATE أو DELETE على جدول، مما يسمح لقاعدة البيانات بفرض القواعد وتسجيل التغييرات ومراجعة البيانات دون الحاجة إلى رمز تطبيق إضافي.

  • فريف: المشغل هو وظيفة يتم استدعاؤها تلقائيًا عند حدوث حدث في قاعدة البيانات مثل INSERT أو UPDATE أو DELETE.
  • 🔁 مجال العمل يقوم FOR EACH ROW بتشغيل المشغل مرة واحدة لكل صف متأثر، بينما يقوم FOR EACH STATEMENT بتشغيله مرة واحدة لكل عملية.
  • 🛠️ خلق: يقوم الأمر CREATE TRIGGER بربط دالة بجدول وتعيين التوقيت قبل أو بعد أو بدلاً من.
  • 📋 قائمة: استعلم عن كتالوج pg_trigger باستخدام SELECT tgname لعرض كل مشغل في قاعدة البيانات.
  • 🗑️ إسقاط: يقوم الأمر DROP TRIGGER بإزالة المشغل، ويمنع الأمر IF EXISTS حدوث خطأ عند فقدانه.
  • 🤖 مساعدة الذكاء الاصطناعي: تقوم المساعدات المدعومة بالذكاء الاصطناعي بإنشاء وظائف تشغيل واقتراح توقيت "قبل" أو "بعد" بناءً على طلب بلغة بسيطة.

PostgreSQL مشغلات

ما هو الزناد في PostgreSQL?

A PostgreSQL تحفيز عملية هي دالة يتم تشغيلها تلقائيًا عند وقوع حدث في قاعدة البيانات على عنصر من عناصرها، مثل جدول. ومن أمثلة أحداث قاعدة البيانات التي يمكنها تفعيل المشغل: الإدراج، والتحديث، والحذف، وما إلى ذلك. علاوة على ذلك، عند إنشاء مشغل لجدول، يتم حذفه تلقائيًا عند حذف ذلك الجدول.

كيف يتم استخدام الزناد في PostgreSQL?

يمكن تحديد المُشغِّل باستخدام عامل التشغيل FOR EACH ROW أثناء إنشائه. سيتم استدعاء هذا المُشغِّل مرة واحدة لكل صف يتم تعديله بواسطة العملية. كما يمكن تحديد المُشغِّل باستخدام عامل التشغيل FOR EACH STATEMENT أثناء إنشائه. سيتم تنفيذ هذا المُشغِّل مرة واحدة فقط لعملية محددة.

PostgreSQL إنشاء الزناد

لإنشاء مشغل، نستخدم وظيفة CREATE TRIGGER. هنا هو بناء الجملة للوظيفة:

CREATE TRIGGER trigger-name [BEFORE|AFTER|INSTEAD OF] event-name
ON table-name
[
 -- Trigger logic
];

اسم المشغل هو اسم المشغل.

الكلمات "قبل" و"بعد" و"بدلاً من" هي الكلمات الرئيسية التي تحدد متى سيتم استدعاء المشغل.

اسم الحدث هو اسم الحدث الذي سيؤدي إلى استدعاء المشغل. هذا يمكن أن يكون INSERT، تحديث، حذف، الخ.

اسم الجدول هو اسم الجدول الذي سيتم إنشاء المشغل عليه.

إذا كان من المقرر إنشاء المشغل لعملية INSERT، فيجب علينا إضافة معلمة اسم العمود ON.

يوضح بناء الجملة التالي ذلك:

CREATE TRIGGER trigger-name AFTER INSERT ON column-name
ON table-name
[
 -- Trigger logic
];

PostgreSQL إنشاء مثال الزناد

سوف نستخدم جدول الأسعار الموضح أدناه:

السعر:

PostgreSQL إنشاء الزناد

لنقم بإنشاء جدول آخر، Price_Audits، حيث سنقوم بتسجيل التغييرات التي تم إجراؤها على جدول الأسعار:

CREATE TABLE Price_Audits (
   book_id INT NOT NULL,
    entry_date text NOT NULL
);

يمكننا الآن تعريف دالة جديدة اسمها Auditfunc:

CREATE OR REPLACE FUNCTION auditfunc() RETURNS TRIGGER AS $my_table$
   BEGIN
      INSERT INTO Price_Audits(book_id, entry_date) VALUES (new.ID, current_timestamp);
      RETURN NEW;
   END;
$my_table$ LANGUAGE plpgsql;

ستقوم الوظيفة المذكورة أعلاه بإدراج سجل في جدول Price_Audits بما في ذلك معرف الصف الجديد ووقت إنشاء السجل.

الآن وقد أصبح لدينا دالة التشغيل، يجب ربطها بجدول الأسعار. سنسمي دالة التشغيل price_trigger. قبل إنشاء سجل جديد، سيتم استدعاء دالة التشغيل تلقائيًا لتسجيل التغييرات. إليك دالة التشغيل:

CREATE TRIGGER price_trigger AFTER INSERT ON Price
FOR EACH ROW EXECUTE PROCEDURE auditfunc();

دعونا نقوم بإدراج سجل جديد في جدول الأسعار:

INSERT INTO Price
VALUES (3, 400);

بعد إدراج سجل في جدول الأسعار، يجب إدراج سجل مماثل في جدول تدقيق الأسعار نتيجةً للمُشغّل الذي أنشأناه. لنتحقق من ذلك:

SELECT * FROM Price_Audits;

سيؤدي هذا إلى إرجاع ما يلي:

PostgreSQL إنشاء الزناد

لقد عمل الزناد بنجاح.

PostgreSQL قائمة التشغيل

جميع المشغلات التي تقوم بإنشائها PostgreSQL يتم تخزينها في جدول pg_trigger. للاطلاع على قائمة المشغلات الموجودة لديك على قاعدة بيانات، قم بالاستعلام عن الجدول عن طريق تشغيل الأمر SELECT كما هو موضح أدناه:

SELECT tgname FROM pg_trigger;

هذا يعيد ما يلي:

PostgreSQL قائمة التشغيل

يشير عمود tgname في الجدول pg_trigger إلى اسم المشغل.

PostgreSQL زناد الإسقاط

عندما لا تعود هناك حاجة إلى الزناد، يمكنك إزالته بسهولة. لإسقاط PostgreSQL المشغل، نستخدم عبارة DROP TRIGGER مع بناء الجملة التالي:

DROP TRIGGER [IF EXISTS] trigger-name
ON table-name [ CASCADE | RESTRICT ];

تشير معلمة اسم المشغل إلى اسم المشغل الذي سيتم حذفه.

يشير اسم الجدول إلى اسم الجدول الذي سيتم حذف المشغل منه.

تحاول جملة IF EXISTS حذف المشغل الموجود. إذا حاولت حذف مشغل غير موجود دون استخدام جملة IF EXISTS، فسوف تحصل على خطأ.

سيساعدك خيار CASCADE على إسقاط كافة الكائنات التي تعتمد على المشغل تلقائيًا.

إذا استخدمت خيار RESTRICT، فلن يتم حذف المشغل إذا كانت الكائنات تعتمد عليه.

على سبيل المثال:

لإسقاط المشغل المسمى example_trigger على جدول Company، قم بتشغيل الأمر التالي:

DROP TRIGGER example_trigger IF EXISTS
ON Company;

باستخدام pgAdmin

والآن دعونا نرى كيف يتم تنفيذ الإجراءات الثلاثة باستخدام pgAdmin.

كيفية إنشاء الزناد في PostgreSQL باستخدام pgAdmin

إليك كيفية إنشاء مُشغّل في PostgreSQL باستخدام pgAdmin:

الخطوة 1) قم بتسجيل الدخول إلى حساب pgAdmin الخاص بك

افتح pgAdmin وقم بتسجيل الدخول إلى حسابك باستخدام بيانات الاعتماد الخاصة بك.

الخطوة 2) إنشاء قاعدة بيانات تجريبية

  1. من شريط التنقل الموجود على اليسار، انقر فوق قواعد البيانات.
  2. انقر فوق العرض التوضيحي.

إنشاء الزناد في PostgreSQL باستخدام pgAdmin

الخطوة 3) اكتب الاستعلام

لإنشاء جدول Price_Audits، اكتب الاستعلام في المحرر:

CREATE TABLE Price_Audits (
   book_id INT NOT NULL,
    entry_date text NOT NULL
)

الخطوة 4) تنفيذ الاستعلام

انقر فوق الزر "تنفيذ".

إنشاء الزناد في PostgreSQL باستخدام pgAdmin

الخطوة 5) تشغيل Code لوظيفة التدقيق

قم بتشغيل الكود التالي لتحديد وظيفة auditfunc:

CREATE OR REPLACE FUNCTION auditfunc() RETURNS TRIGGER AS $my_table$
   BEGIN
      INSERT INTO Price_Audits(book_id, entry_date) VALUES (new.ID, current_timestamp);
      RETURN NEW;
   END;
$my_table$ LANGUAGE plpgsql

الخطوة 6) تشغيل Code لإنشاء مُشغِّل

قم بتشغيل الكود التالي لإنشاء المشغل price_trigger:

CREATE TRIGGER price_trigger AFTER INSERT ON Price
FOR EACH ROW EXECUTE PROCEDURE auditfunc()

الخطوة 7) أدخل سجلا جديدا

  1. قم بتشغيل الأمر التالي لإدراج سجل جديد في جدول الأسعار:
INSERT INTO Price
VALUES (3, 400)
  1. قم بتشغيل الأمر التالي للتحقق مما إذا كان قد تم إدراج سجل في جدول Price_Audits:
SELECT * FROM Price_Audits

يجب أن يعيد هذا ما يلي:

إنشاء الزناد في PostgreSQL باستخدام pgAdmin

الخطوة 8) التحقق من محتوى الجدول

دعونا نتحقق من محتويات جدول Price_Audits.

مشغلات القائمة باستخدام pgAdmin

الخطوة 1) قم بتشغيل الأمر التالي للتحقق من المشغلات في قاعدة البيانات الخاصة بك:

SELECT tgname FROM pg_trigger

هذا يعيد ما يلي:

مشغلات القائمة باستخدام pgAdmin

قطرةping المشغلات باستخدام pgAdmin

لإسقاط المشغل المسمى example_trigger على جدول Company، قم بتشغيل الأمر التالي:

DROP TRIGGER example_trigger IF EXISTS
ON Company

قم بتنزيل قاعدة البيانات المستخدمة في هذا البرنامج التعليمي

الأسئلة الشائعة

يتم تشغيل مُشغّل "قبل" قبل كتابة تغيير الصف، بحيث يمكنه تعديل الصف أو رفضه. أما مُشغّل "بعد" فيتم تشغيله بعد حفظ التغيير، وهو مناسب لمهام التسجيل والتدقيق.

يتم تعريف مُشغّل INSTEAD OF على عرض، وليس على جدول. وهو يستبدل أوامر INSERT أو UPDATE أو DELETE بمنطق مخصص، مما يجعل العرض القابل للقراءة فقط قابلاً للكتابة.

عادة ما تُكتب دوال التشغيل بلغة PL/pgSQL. PostgreSQL يدعم أيضًا لغة PL/Python، PL/Perl، PL/Tcl، و C، حتى تتمكن من اختيار اللغة التي تناسب منطقك.

استخدم الأمر ALTER TABLE table-name DISABLE TRIGGER trigger-name لإيقاف تشغيله، والأمر ENABLE TRIGGER لإعادة تشغيله. هذا يمنع حدوث انقطاع في الاتصال.ping وإعادة إنشاء المشغل أثناء عمليات التحميل الكبيرة.

نعم. كل مُشغِّل يُضيف عبئًا على كل صف أو عبارة مُتأثرة، لذا فإن منطق المُشغِّل المُعقد قد يُبطئ عمليات الكتابة. اجعل وظائف المُشغِّل قصيرة، وقم بفهرسة أي أعمدة تستعلم عنها.

نعم. إذا قام مُشغّل بتغيير جدول آخر يحتوي أيضًا على مُشغّلات، فسيتم تشغيل تلك المُشغّلات أيضًا، مما يؤدي إلى إنشاء مُشغّلات متتالية. PostgreSQL يحد من عمق التداخل لمنع الحلقات اللانهائية.

تقوم مساعدات البرمجة بالذكاء الاصطناعي بتحويل طلب اللغة العادية إلى عبارة CREATE TRIGGER كاملة ووظيفة تشغيل، وتقترح توقيت BEFORE أو AFTER، وتشرح PL/pgSQL المُنشأ للمراجعة السريعة.

نعم. تقوم أدوات مثل pgai والمساعدين القائمين على GPT بترجمة القاعدة الموصوفة إلى SQL تشغيلي، ويمكنها إنشاء مشغلات INSERT التي تقوم تلقائيًا بوضع علامات على البيانات الجديدة أو التحقق من صحتها عند وصولها.

تلخيص هذه التدوينة بـ: