منبع اصلی نوشتار زیر در این لینک قرار دارد

ایجاد TRIGGER در MySQL

TRIGGER ویژگی است که از MySQL 5.0.2 به بعد به MySQL اضافه شد و شی است با نامی منحصر به فرد که در اسکیما ذخیره می شود. TRIGGER تنها بر روی جدول های دایمی قابل تعریف است و نمی توان آنرا بر روی جدول های موقتی یا Temporary Table یا View ها تعریف کرد. TRIGGER شی است که در ارتباط با جدولی است و وقتی که یک رخداد خاص روی جدول صورت گیرد (مانند درج یک رکورد جدید)، آنگاه TRIGGER آن جدول فعال می شود.Syntax ایجاد TRIGGER در MySQL به صورت زیر است :

اجر TRIGGER با دستور create trigger انجام می شود و نیاز به SUPER privilege دارد. هر TRIGGER باید نامی منحصر به فرد داشته باشد. trigger_time زمان فعالیت یا عمل TRIGGER را نشان می دهد. که می تواند BEFORE یا AFTER باشد. trigger_event رخدادی است که TRIGGER را فعال می کند و یکی از مقادیر زیر را شامل می شود :

  • INSERT : هرگاه که سطر جدیدی به جدول اضافه شود. دستور های INSERT, LOAD DATA و REPLACE بر روی جدول.
  • UPDATE : هرگاه که سطری از جدول بروز شود. دستور UPDATE بر روی سطر یا سطر هایی از جدول.
  • DELETE : هرگاه که سطری از جدول حذف شود. مانند اجرای دستور های DELETE یا REPLACE. دستور های  TRUNCATE TABLE یا DROP TABLE تاثیری ندارند و باعث فعال شدن TRIGGER نمی شوند.

trigger_body عبارت یا Statement ای است که زمانی که TRIGGER فعال می شود اجرا خواهد شد. برای داشتن چندین عبارت در trigger_body از عبارت BEGIN … END استفاده می کنیم.

مثال زیر چگونگی ایجاد یک TRIGGER از نوع INSERT را نشان می دهد که قبل از درج رکورد جدید درون جدول فعال می شود.

; CREATE DATABASE mydb

; USE mydb

;((CREATE TABLE account (acct_num INT, amount DECIMAL(10,2

سپس با دستور زیر بر روی جدول account یک TRIGGER به نام ins_sum ایجاد می کنیم.

CREATE TRIGGER ins_sum BEFORE INSERT ON account

; FOR EACH ROW SET @sum = @sum + NEW.amount

BEFORE زمان عمل TRIGGER یا action time را نشان می دهد. در بالا BEFORE INSERT ON account یعنی TRIGGER پیش از درج هر سطر جدید بر روی جدول account فعال خواهد شد. می توانسیم به جای BEFORE از AFTER استفاده کنیم، آنگاه خوانده می شد “پس از درج هر سر جدید در جدول account”.

INSERT یعنی رخدادی که در صورت اتفاق افتادن آن، TRIGGER فعال خواهد شد و به طبع عبارت … FOR EACH که trigger_body است اجرا می شود. می توانستیم به جای INSERT یکی از دو مقدار UPDATE یا DELETE را استفاده کنیم.

FOR EACH ROW بدنه TRIGGER را مشخص می کند. بدنه هر زمان که TRIGGER فعال شود، اجرا خواهد شد. در این مثال هر زمان که سطر جدیدی درج شود با استفاده از یک SET متغیری به نام sum مقداردهی می شود به این صورت که جمع مقدار قبلی در متغیر sum با مقدار جدید درج شده در ستون amount که توسط NEW.amount نشان داده می شود. پس لازم است نخست با دستور زیر متغیر sum را پیش از درج، ایجاد کنیم.

; SET @sum = 0

و سپس با دستور زیر سه رکورد را در جدول درج می کنیم.

;(INSERT INTO account VALUES (137,14.98),(141,1937.50),(97,-100.00

و با Query زیر مقدار متغیر sum نشان داده می شود.

با دستور زیر می توانید TRIGGER را پاک کنید و یا با پاک شدن جدول، تمامی TRIGGER های آن نیز پاک خواهند شد.

;DROP TRIGGER SCHEMA_NAME.TRIGGER_NAME

همانطور که گفته شد نام TRIGGER ها در اسکیما باید منحصر به فرد باشد. محدودیتی دیگری که وجود دارد اینکه نمی توانید TRIGGER هایی با action time و trigger_event یکسان بر روی یک جدول ایجاد کنید یعنی نمی توانید دو تریگر BEFORE UPDATE را بر روی یک جدول ایجاد کنید. اما می توانید در بدنه تریگر از عبارت  BEGIN … END برای تعریف چندین عبارت پس از FOR EACH ROW (منظور عبارتی که به محض فعال شدن تریگر باید اجرا شود) تعریف کنید.

درون تریگر از دو عبارت NEW و OLD برای دسترسی به سطر های تحت تاثیر تریگر می توانید استفاده کنید. اما در یک تریگر INSERT تنها می توانید از  NEW.col_name و در تریگر از نوع DELETE تنها می توانید از OLD.col_name استفاده کنید. در تریگر UPDATE عبارت OLD.col_name به سطر هایی از ستون پیش از UPDATE اشاره می کند و NEW.col_name به سطرهایی از ستون پس از UPDATE اشاره می کند و سطر جدید یا New Row معنی ندارد.

ستونی که با OLD نامگذاری می شود به صورت Read Only است. شما می توانید به آن اشاره کنید نه اینکه آنرا تغییر دهید.در صورتی می توانید به ستونی با NEW اشاره کنید که مجوز SELECT را بر روی آن داشته باشید. در صورتی در یک تریگر از نوع BEFORE می توانید با دستور زیر مقداری را تغییر دهید که مجوز UPDATE را بر روی آن ستون داشته باشید.

SET NEW.col_name = value

در تریگر BEFORE مقدار NEW برای ستون های AUTO INCREMENT مقدار 0 است و نه یک sequence number که بطور خودکار در زمان درج یک سطر جدید به طور معول در جدول ایجاد می شود. با استفاده از BEGIN … END می توانیم چندین عبارت را درون بدنه تریگر اجرا کنیم.

مثال بالا قابل فهم است و نمونه ای از استفاده BEGIN … END را نشان می دهد و باید پس از FOR EACH ROW بیاید. برای مطالعه بیشتر لینک های زیر را از سایت MySQL بخوانید



برچسب ها : ,