English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

دليل أساسي لـ SQLite

دليل متقدم لـ SQLite

واجهة برمجة تطبيقات SQLite

تنبيهات SQLite (Trigger)

تنبيهات SQLite (Trigger) هي دالة استدعاء قاعدة البيانات، تتم تنفيذها تلقائيًا/الاستدعاء عند حدوث الحدث المحدد في قاعدة البيانات. إليك نقاط رئيسية حول تنبيهات SQLite:

  • يمكن لتنبيهات SQLite (Trigger) تحديد التشغيل عند حدوث DELETE أو INSERT أو UPDATE في جدول معين في قاعدة البيانات، أو عند تحديث عمود أو عدة أعمدة معينة في جدول.

  • يدعم SQLite فقط تنبيهات (Trigger) لكل سطر (FOR EACH ROW)، وليس هناك تنبيهات (Trigger) لكل جملة (FOR EACH STATEMENT). لذلك، يمكن تحديد FOR EACH ROW بشكل اختياري.

  • عندما يمكن للفقرة WHEN و动作 التنبيه (Trigger) الوصول إلى استخدام النموذج. NEW.column-name و OLD.column-name الإشارة إلى إدراج أو حذف أو تحديث عنصر سطر من الجدول، حيث يكون اسم العنصر هو اسم العمود من الجدول المرتبط بالتنبيه.

  • إذا تم تقديم جملة WHEN، يتم تنفيذ جملة SQL فقط للسطور التي تكون صحيحة للجملة WHEN. إذا لم يتم تقديم جملة WHEN، يتم تنفيذ جملة SQL لكل السطور.

  • كلمات المفتاح BEFORE أو AFTER تحدد متى يتم تنفيذ动作 التفعيل، أي قبل أو بعد إدراج أو تعديل أو حذف السطر المرتبط.

  • عندما يتم حذف الجدول المرتبط بتفعيل، يتم حذف التفعيل (Trigger) تلقائيًا.

  • يجب أن يكون الجدول الذي يتم تعديله موجودًا في نفس قاعدة البيانات، كجدول أو عرض مرتبط بتفعيل، ويجب أن يستخدم فقط tablename، بدلاً من database.tablename.

  • وظيفة SQL الخاصة RAISE() يمكن استخدامها لإطلاق استثناءات داخل برنامج التفعيل.

النحو

النحو التالي هو أساس إنشاء تفعيل.

CREATE  TRIGGER trigger_name [BEFORE|AFTER] event_name 
ON table_name
BEGIN
 -- لغة التفعيل....
END;

في هذا المكان،event_nameيمكن أن تكون علىINSERT،DELETEوUPDATEعمليات قاعدة البياناتtable_nameيمكنك اختيار تخصيص FOR EACH ROW بعد اسم الجدول.

النحو التالي لإنشاء تفعيل على عمليات التحديث في جدول أو عدة جداول معينة.

CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name 
ON table_name
BEGIN
   -- 逻辑 التفعيل هنا....
END;

مثال

لنفكر في حالة واحدة، نريد تدقيق كل سجل يتم إدراجه في جدول COMPANY، هذا الجدول الجديد الذي قمنا بإنشائه، كما هو موضح أدناه (إذا كان موجودًا، يتم حذف جدول COMPANY).

sqlite> CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

من أجل الحفاظ على حالة التجربة التدقيقية، طالما هناك مدخل جديد في جدول COMPANY، سنقوم بإنشاء جدول جديد يُدعى AUDIT، وسنقوم بإدراج رسائل السجلات فيه.

sqlite> CREATE TABLE AUDIT(
   EMP_ID INT NOT NULL,
   ENTRY_DATE TEXT NOT NULL
);

在这里,ID是AUDIT记录ID,EMP_ID是来自COMPANY表的ID,DATE将在COMPANY表中创建记录时保留时间戳。现在让我们在COMPANY表上创建触发器,如下所示:

sqlite> CREATE TRIGGER audit_log AFTER INSERT 
ON COMPANY
BEGIN
   INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, datetime('now'));
END;

现在,我们将开始实际的工作,让我们开始在COMPANY表中插入记录,这将导致在AUDIT表中创建审核日志记录。在COMPANY表中创建一条记录,如下所示-

sqlite> INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Paul', 32, 'California', 20000.00 );

这将在COMPANY表中创建一条记录,如下所示-

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0

同时,将在AUDIT表中创建一条记录。该记录是触发器的结果,该触发器是我们在COMPANY表中的INSERT操作上创建的。同样,您可以根据需要在UPDATE和DELETE操作上创建触发器。

EMP_ID      ENTRY_DATE
----------  -------------------
1           2013-04-05 06:26:00

قائمة الترigger

يمكنك منsqlite_masterقائمة جميع الترigger في الجدول، مثل ما يلي:

sqlite> SELECT name FROM sqlite_master
WHERE type = 'trigger';

الجملة SQLite المذكورة أعلاه ستقوم فقط بإدراج سجل واحد، مثل ما يلي-

name
----------
audit_log

إذا كنت ترغب في قائمة جميع الترigger على الجدول المحدد، استخدم جملة AND مع اسم الجدول، مثل ما يلي:

sqlite> SELECT name FROM sqlite_master
WHERE type = 'trigger' AND tbl_name = 'COMPANY';

الجملة SQLite أعلاه ستجد سطرًا واحدًا فقط، مثلما يلي-

name
----------
audit_log

حذف المؤثرات

إليك الأمر DROP، وهو يمكن استخدامه لتحذيف المؤثرات الموجودة.

sqlite> DROP TRIGGER trigger_name;