همونطور که عرض کردم، Trigger در دیتابیس ایجاد میشه و این trigger در زمان مناسب توسط خود موتور SQLite اجرا میشه و نیازی به کنترل ما نداره.
فرصت ساخت مثال MMB رو ندارم، گرچه نیازی هم نیست، پس فقط کدها رو میزارم.
یک دیتابیس جدید ایجاد کنید. کدهای SQL زیر رو اجرا کنید تا Tableها و Trigger مربوطه ساخته بشه:
کد:
CREATE TABLE "Unit" ("id" INTEGER PRIMARY KEY NOT NULL ,"cat" TEXT,"width" FLOAT NOT NULL DEFAULT (1) ,"height" FLOAT NOT NULL DEFAULT (1) ,"depth" FLOAT NOT NULL DEFAULT (0.1) );
CREATE TABLE "categories" ("id" INTEGER PRIMARY KEY NOT NULL ,"cat_id" INTEGER NOT NULL ,"name" TEXT NOT NULL ,"width" FLOAT NOT NULL ,"height" FLOAT NOT NULL ,"depth" FLOAT NOT NULL );
CREATE TRIGGER "update_categories" AFTER UPDATE ON "Unit" FOR EACH ROW BEGIN UPDATE categories SET width = (0.75 * new.width), height = (1.3 * new.height), depth = new.depth WHERE cat_id = new.id; END;
خط اول و دوم که دوتا جدول ایجاد کردیم که نیازی به توضیح نداره.
جدول اول حاوی واحد اندازه گیری ما هست که مثلاً واحد پیشفرض اندازه گیری برای پنجره، ارتفاع = 1، عرض = 1 و عمق برابر 0.1 هست. فیلد id این جدول نشون دهنده ی id اون دسته بندی هست (مثلاً معیار اندازه گیری برای پنجره ها، درها...)
با کد زیر داده ی نمونه برای اندازه ی معیار پنجره (Window) رو وارد می کنیم:
کد:
INSERT INTO "main"."Unit" ("cat","width","height","depth") VALUES ('Windows',1,1,0.1);
id این رکورد برابر 1 هست.
جدول دوم دسته بندی ما هست، مثلاً یک پنجره ممکنه عرضش 0.75 عرض معیار، ارتفاعش 1.3 ارتفاع معیار و عمقش برابر با عمق معیار باشه. فیلد cat_id نشون دهنده ی دسته بندی والد هست.
یعنی اگر قصد داشته باشیم یک پنجره ی جدید ایجاد کنیم، فیلد cat_id برابر 1 که آی دی دسته ی "پنجره" هست
یک داده ی نمونه از دسته بندی پنجره در جدول دوم ایجاد می کنیم که نسبت اندازه ها به شکلی که توضیح داده شد هست.
کد:
INSERT INTO "main"."categories" ("cat_id", "name", "width", "height", "depth") VALUES (1, 'long_window', 0.75, 1.3, 0.1);
پس باید Trigger به گونه ای ساخته بشه که با ایجاد تغییرات در واحد اندازه گیریمون (Unit)، تغییرات لازم رو در زیر مجموعه های اون دسته بندی اعمال کنه.
در خط سوم Trigger ایجاد شده.
نام Trigger که ساختیم update_categories هست.
عبارت
"AFTER UPDATE ON "Unit به این معنا هست که این Trigger پس از ایجاد تغییرات (UPDATE) در تیبل Unit اجرا میشه.
عبارت FOR EACH ROW هم به این معنا هست که کدهای مشخص شده برای هر رکورد (Row) اجرا میشه.
کدها بین عبارات BEGIN و END نوشته میشن.
کدی که اجرا کردیم این هست:
کد:
UPDATE categories SET width = (0.75 * new.width), height = (1.3 * new.height), depth = new.depth WHERE cat_id = new.id;
این کد عرض، ارتفاع و عمق همه ی زیر مجموعه های اون واحد رو تغییر میده (WHERE cat_id = new.id)
عبارت new.width اشاره به مقدار جدید فیلد width از جدولی که Trigger برای اون ساخته شده (Unit) میکنه.
دیتابیسی بر اساس ساختاری که توضیح داده شد ایجاد کنید. یک رکورد جدید برای Unit بسازید و بر اساس id اون یک یا چند رکورد در جدول categories ایجاد کنید.
حالا مقادیر رکورد موجود در جدول unit رو تغییر بدید، می بینید که تغییرات در جدول categories هم اعمال میشه.
البته این فقط یک مثال برای نشون دادن کاربرد Trigger هست و خود مثال شاید چندان معقول نباشه.