×

TRIGGERS در SQLite

فصل بیست و هشتم :

TRIGGERS در SQLite

یک تریگر تابعی است که بطور اتوماتیک هنگامی که اتفاق خاصی در دیتابیس میفتد فراخوانی و اجرا میشود.
در مورد تریگر های SQLite نکات ذیل قابل توجه هستند :

  • 1. یک تریگر SQLite می تواند در هنگامی که در یک جدول دیتابیس ما عمل INSERT , UPDATE و یا DELETE ی رخ داد اجرا شود و یا اینکه در هنگام UPDATE مقادیر ستون و یا ستونهایی از یک جدول .
  • 2. در حال حاضرSQLite فقط از تریگر های FOR EACH ROW پشتیبانی میکند.
  • 3. عبارت WHEN و تریگر هر دو می توانند به اجزائ یک سطر INSERT , UPDATE و DELETE شده دسترسی اشته باشند و اینکار از طریق NEW.column-name و OLD.column-name مقدور است که در آن column-name نام ستونی از جدول است که تریگر بروی ان فعال شده است.
  • 4. هنگامی که از عبارت WHEN استفاده شود . دستورات موجود در تیگر قثط برای سطر هایی عمل خواهند کرد که در آنها جواب عبارت WHEN برابر با true باشد.واگر عبارت WHEN ذکر نشده باشد دستورات برای تمامی رکورد ها اعمال خواهند شد.
  • 5. کلمات کلیدی BEFORE و AFTER مشخص میکنند که دستورات موجود در تریگر به چه ترتیبی بعد و یا قبل از INSERT,UPDATE و DELETE اجرا شوند.
  • 6. تریگر هنگامی که جدولی که بروی آن تنظیم شده است پاک شود (Drop شود)بطور اتوماتیک حذف خواهد شد.
  • 7. جدولی که می خواهیم رکورد هایی آن بر اثر دستورات داخل تریگر تغییر کنند باید داخل دیتابیسی باشد که خود جدول و یا view که تریگر روی ان تنظیم شده است باشد. بنابراین نام جدول فقط بصورت tablename خواهد بود و نهdatabase.tablename
  • 8. تابع خاص RAISE() می تواند داخل تریگر جهت ایجاد یک خطا یا exception بکار رود

الگوی کلی تریگر بشکل ذیل است :
CREATE TRIGGER trigger_name [BEFORE|AFTER] event_name
ON table_name
BEGIN
-- Trigger logic goes here....
END;

که در آن event_name می تواند INSERT,UPDATE و یا DELETE باشد و table_name نام جدولی است که می خوهیم اگر یکی از سه عمل بالا بروی ان انجام شد. دستورات داخل تریگر انجام شوند.
CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name
ON table_name
BEGIN
-- Trigger logic goes here....
END;

دستورات بالا تریگری را بروی جدول table_name می سازد که هنگامی که عمل UPDATE بروی ستون و یا ستونهایی از آن جدول انجام شد ، دستورات داخل تریگر انجام شوند.
مثال : فرض کنید می خواهید هنگامی که رکوردی در جدول 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
);

برای نگهداری اطلاعات مربوط به درج یک رکورد جدید در این جدول باید جدولی دیگر بسازیم:
sqlite> CREATE TABLE AUDIT(
EMP_ID INT NOT NULL,
ENTRY_DATE TEXT NOT NULL
);

که در آن فیلد EMP_ID در واقعID هر رکورد جدید INSERT شده در جدول COMPANY خواهد بود و ENTRY_DATE زمان درج آن :
sqlite> CREATE TRIGGER audit_log AFTER INSERT
ON COMPANY
BEGIN
INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, datetime('now'));
END;

اینطور بخوانید : تریگری بنام audit_log بساز که بعد از هرعمل INSERT در جدول COMPANY ، ID آن رکورد و تاریخ جاری سیستم را در جدولAUDIT درج کند. به new.ID خوب توجه کنید.
حالا یک رکورد در جدول COMPANY درج میکینم :
sqlite> INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Paul', 32, 'California', 20000.00 );

بنابراین محتویات جدول ما اینگونه خواهد بود

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

                                        

به مجرد اینکه رکورد بالا در جدول COMPANY درج شد .تریگر ما رکورد را در جدول AUDIT بطور اتواتیک درج میکند پس محتویات AUDIT بشکل ذیل خوهد بود :
EMP_ID      ENTRY_DATE
----------  -------------------
1           2013-04-05 06:26:00

                                          

جهت لیست کردن تریگر های موجود از جدول sqlite_maser بروش ذیل عمل میکینم :
sqlite> SELECT name FROM sqlite_master
WHERE type = 'trigger';

که نتیجه آن :
name
----------
audit_log

                                           

خواهد بود.
حالا اگر بخواهید تریگر های موجود در یک جدول را لیست کنید :
sqlite> SELECT name FROM sqlite_master
WHERE type = 'trigger' AND tbl_name = 'COMPANY';

و نتیجه بشکل ذیل خواهد بود:
name
----------
audit_log

                                            

جهت حذف یک تریگر مجود نیز مانند کاری که برای حذف سایراشیائ دیتابیس انجام میدهیم از DROP استفاده میکینم
sqlite> DROP TRIGGER trigger_name;
کلمه کلیدی دیگری راهم می توان در تریگربکار برد تا بجا عملی که بازای ان تریگر اجرا شده است عمل دیگری انجام شود و آن INSTEAD OF می باشد.


مفاهیم و موضوعات این فصل عبارتند از :

  • TRIGGER در SQLite

vatantop
نظرات و سوالات درج سوال/ نظر