SQL TRIGGER

•มกราคม 8, 2011 • ให้ความเห็น

การสร้างและใช้งาน Trigger
> จะเกิดการทำงานก็ต่อเมื่อมีเหตุการณ์ที่เกี่ยวข้องกับการเปลี่ยนแปลงแก้ไขข้อมูลเกิดขึ้นตรงกันกับที่ object นี้ได้ถูกกำหนดไว้
> จะมีการทำงานในทุกๆครั้ง ที่มีการเปลี่ยนแปลงของข้อมูลภายในตารางที่กำหนดทั้งที่เป็นผลมาจากการทำ INSERT หรือ UPDATE หรือ DELETE

ข้อจำกัดของ Trigger
> ไม่สามารถใช้ได้กับ Temporary Table
> ไม่สามารถส่งคืนข้อมูลกลับมาเป็น Recordset ได้
> คำสั่ง WRITETEXT ไม่สามารถ ปลุกให้ Trigger ทำงานได้
> คำสั่ง ต่อไปนี้ทำงานบน Trigger ไม่ได้ ได้แก่ ALTER DATABASE, CREATE DATABASE, DISK INIT,DISK RESIZE, DROP DATABASE, LOAD DATABASE, LOAD LOG, RECONFIGURE, RESTORE DATABASE,RESTORE LOG

Inserted Table และ Deleted Table
>รู้จักและเข้าใจตาราง Inserted และ Deleted
โดยตารางนี้จะใช้งานได้เพียงภายในระยะการทำงานของ Trigger หนึ่งๆเท่านั้น
โดยตารางที่กล่าวถึงนี้จะเป็นตารางเปล่าๆที่ไม่มีข้อมูลใดๆ
แต่จะมีโครงสร้างทั้งชื่อและจำนวนคอลัมน์ ตลอดจนประเภทข้อมูลเหมือนกับตาราง
ที่ Trigger นั้นอาศัยอยู่ทุกประการ
>คำสั่ง INSERT กับ Trigger
เมื่อมีการเพิ่มแถวข้อมูลให้กับตารางข้อมูลที่ Trigger อาศัยอยู่
ระบบจะเพิ่มแถวข้อมูลเดียวกันนี้ไปยังตาราง Inserted ด้วย
>คำสั่ง DELETE กับ Trigger
เมื่อมีการลบแถวข้อมูลออกจากตารางข้อมูลที่ Trigger อาศัยอยู่
ระบบจะเพิ่มแถวข้อมูลที่ถูกลบออกนี้ไปยังตาราง Deleted ด้วย
>คำสั่ง UPDATE กับ Trigger
เมื่อมีการแก้ไขข้อมูลในตารางข้อมูลที่ Trigger อาศัยอยู่
ระบบจะทำงาน 2 ขั้นตอน คือ
จะนำแถวข้อมูลก่อนการ update ไปเพิ่มไว้ในตาราง Deleted
และจะนำแถวข้อมูลที่ได้หลังการ update ไปเพิ่มไว้ในตาราง Inserte

BEFOR TRIGGERS หรือ AFTER TRIGGERS
เป็น Trigger ซึ่งจะทำงานภายหลังจากที่มีคำสั่ง SQL ที่เกี่ยวข้อง
กับการเปลี่ยนแปลงข้อมูล ( INSERT, DELETE, UPDATE )
โดยมีขั้นตอนการทำงาน ดังนี้
1) ทำคำสั่ง SQL ตามปกติ
2) ที่ Table ใดๆ จะมีการตรวจสอบความถูกต้องของข้อมูลด้วย Constraint ต่างๆ
3) ระบบทำการสร้างตาราง Inserted และ Deleted
4) เริ่มทำงาน BEFOR TRIGGERS หรือ AFTER TRIGGERS
โดยมีข้อจำกัดทางด้านการใช้งาน ดังนี้
1) ใช้ได้กับ Table เท่านั้น
2) สามารถสร้าง Trigger ได้หลายตัว เพื่อทำงานสำหรับคำสั่ง INSERT, DELETE, UPDATE
3) สามารถทำงานร่วมกับ Table ที่ถูกควบคุมความถูกต้องด้วย CASCADING REFERENCES
4) ในกรณีที่มีหลาย Trigger สามารถกำหนดลำดับแรกสุด และท้ายสุด ที่จะให้ Trigger ทำงานได้
5) ไม่อนุญาติให้ใช้กับคอลัมน์ประเภท text, ntext, image ที่อยู่ในตาราง Inserted และ Deleted

example:

CREATE TABLE test1(a1 INT);
CREATE TABLE test2(a2 INT);
CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
CREATE TABLE test4(
  a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  b4 INT DEFAULT 0
);

delimiter |

CREATE TRIGGER testref BEFORE INSERT ON test1
  FOR EACH ROW BEGIN
    INSERT INTO test2 SET a2 = NEW.a1;
    DELETE FROM test3 WHERE a3 = NEW.a1;
    UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
  END;
|

delimiter ;

INSERT INTO test3 (a3) VALUES
  (NULL), (NULL), (NULL), (NULL), (NULL),
  (NULL), (NULL), (NULL), (NULL), (NULL);

INSERT INTO test4 (a4) VALUES
  (0), (0), (0), (0), (0), (0), (0), (0), (0), (0);

Suppose that you insert the following values into table test1 as shown here:

mysql> INSERT INTO test1 VALUES 
    -> (1), (3), (1), (7), (1), (8), (4), (4);
Query OK, 8 rows affected (0.01 sec)
Records: 8  Duplicates: 0  Warnings: 0

As a result, the data in the four tables will be as follows:

mysql> SELECT * FROM test1;
+------+
| a1   |
+------+
|    1 |
|    3 |
|    1 |
|    7 |
|    1 |
|    8 |
|    4 |
|    4 |
+------+
8 rows in set (0.00 sec)

mysql> SELECT * FROM test2;
+------+
| a2   |
+------+
|    1 |
|    3 |
|    1 |
|    7 |
|    1 |
|    8 |
|    4 |
|    4 |
+------+
8 rows in set (0.00 sec)

mysql> SELECT * FROM test3;
+----+
| a3 |
+----+
|  2 |
|  5 |
|  6 |
|  9 |
| 10 |
+----+
5 rows in set (0.00 sec)

mysql> SELECT * FROM test4;
+----+------+
| a4 | b4   |
+----+------+
|  1 |    3 |
|  2 |    0 |
|  3 |    1 |
|  4 |    2 |
|  5 |    0 |
|  6 |    0 |
|  7 |    1 |
|  8 |    1 |
|  9 |    0 |
| 10 |    0 |
+----+------+
10 rows in set (0.00 sec)

example:

CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
CREATE TRIGGER upd_check BEFORE UPDATE ON account
FOR EACH ROW
BEGIN
IF NEW.amount 100 THEN
SET NEW.amount = 100;
END IF;
END;
INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00);
UPDATE account SET amount = 299 WHERE acct_num =141;

example:

CREATE TRIGGER tb4
BEFORE INSERT ON `questionaire`
FOR EACH ROW
BEGIN

IF NEW.QN_WORK_STATUS < 3 THEN
UPDATE grad_tb4 SET as0 = as0 + 1
WHERE FAC_ID = (SELECT `FAC_ID` FROM `uoc_stdgraduate` WHERE STD_ID = NEW.STD_ID )
AND YEAR = (SELECT `G_CONFIRM` FROM `uoc_stdgraduate` WHERE STD_ID = NEW.STD_ID );

ELSEIF NEW.QN_TIME_FINDWORK = 01 THEN
UPDATE grad_tb4 SET as1 = as1 + 1
WHERE FAC_ID = (SELECT `FAC_ID` FROM `uoc_stdgraduate` WHERE STD_ID = NEW.STD_ID )
AND YEAR = (SELECT `G_CONFIRM` FROM `uoc_stdgraduate` WHERE STD_ID = NEW.STD_ID );

ELSEIF NEW.QN_TIME_FINDWORK = 02 THEN
UPDATE grad_tb4 SET as2 = as2 + 1
WHERE FAC_ID = (SELECT `FAC_ID` FROM `uoc_stdgraduate` WHERE STD_ID = NEW.STD_ID )
AND YEAR = (SELECT `G_CONFIRM` FROM `uoc_stdgraduate` WHERE STD_ID = NEW.STD_ID );

ELSEIF NEW.QN_TIME_FINDWORK = 03 THEN
UPDATE grad_tb4 SET as3 = as3 + 1
WHERE FAC_ID = (SELECT `FAC_ID` FROM `uoc_stdgraduate` WHERE STD_ID = NEW.STD_ID )
AND YEAR = (SELECT `G_CONFIRM` FROM `uoc_stdgraduate` WHERE STD_ID = NEW.STD_ID );

ELSEIF NEW.QN_TIME_FINDWORK = 04 THEN
UPDATE grad_tb4 SET as4 = as4 + 1
WHERE FAC_ID = (SELECT `FAC_ID` FROM `uoc_stdgraduate` WHERE STD_ID = NEW.STD_ID )
AND YEAR = (SELECT `G_CONFIRM` FROM `uoc_stdgraduate` WHERE STD_ID = NEW.STD_ID );

ELSEIF NEW.QN_TIME_FINDWORK = 05 THEN
UPDATE grad_tb4 SET as5 = as5 + 1
WHERE FAC_ID = (SELECT `FAC_ID` FROM `uoc_stdgraduate` WHERE STD_ID = NEW.STD_ID )
AND YEAR = (SELECT `G_CONFIRM` FROM `uoc_stdgraduate` WHERE STD_ID = NEW.STD_ID );

ELSEIF NEW.QN_TIME_FINDWORK = 06 THEN
UPDATE grad_tb4 SET as6 = as6 + 1
WHERE FAC_ID = (SELECT `FAC_ID` FROM `uoc_stdgraduate` WHERE STD_ID = NEW.STD_ID )
AND YEAR = (SELECT `G_CONFIRM` FROM `uoc_stdgraduate` WHERE STD_ID = NEW.STD_ID );

ELSEIF NEW.QN_OCCUP_TYPE =04 THEN
UPDATE grad_tb4 SET as7 = as7 + 1
WHERE FAC_ID = (SELECT `FAC_ID` FROM `uoc_stdgraduate` WHERE STD_ID = NEW.STD_ID )
AND YEAR = (SELECT `G_CONFIRM` FROM `uoc_stdgraduate` WHERE STD_ID = NEW.STD_ID );

ELSEIF NEW.QN_TIME_FINDWORK = 07 THEN
UPDATE grad_tb4 SET as8 = as8 + 1
WHERE FAC_ID = (SELECT `FAC_ID` FROM `uoc_stdgraduate` WHERE STD_ID = NEW.STD_ID )
AND YEAR = (SELECT `G_CONFIRM` FROM `uoc_stdgraduate` WHERE STD_ID = NEW.STD_ID );

ELSEIF NEW.QN_WORK_STATUS = 4 THEN
UPDATE grad_tb4 SET as9 = as9 + 1
WHERE FAC_ID = (SELECT `FAC_ID` FROM `uoc_stdgraduate` WHERE STD_ID = NEW.STD_ID )
AND YEAR = (SELECT `G_CONFIRM` FROM `uoc_stdgraduate` WHERE STD_ID = NEW.STD_ID );

END IF;
END|

Advertisements

SQL REPLACE

•มกราคม 8, 2011 • ให้ความเห็น

เป็นคำสั่งที่ใช้สำหรับการระบุเงื่อนไขการเลือกข้อมูลในตาราง (Table)

โดยทำการแทนที่ข้อความที่พบในตำแหน่งที่ต้องการ

ตัวอย่าง
REPLACE INTO rpt_fac                        /*แทนที่ในตาราง rpt_fac */
SELECT `FAC_ID` , COUNT( * ) AS FAC_COUNT
FROM `uoc_curr`
GROUP BY `FAC_ID`
/*เลือกใส่ไปในฟิลด์ FAC_ID และ FAC_COUNT ใน rpt_fac

โดยเอา FAC_ID และ COUNT( * ) ของการจับกลุ่ม `FAC_ID` ในตาราง uoc_curr */


เวลาที่หายไป..

•กันยายน 19, 2010 • ให้ความเห็น
พอเริ่มทำงานเวลาเล่นของคนเราก็จะน้อยลง
ตอนนี้เวลาของเราแทบจะไม่มีให้ตัวเองเลย
ทั้งงาน เรียน ครอบครัว  วัน ๆ แทบไม่ได้ทำตัวไร้สาระเลย
ไม่ใช่ไม่อยากไปสังสรรกับเพื่อน ๆนะ  แต่สุขภาพตัวเอง
ช่วงนี้ฝนตกหนัก  ก็พยายามระวังตัวเองไม่ให้แย่
ไหนจะต้องทำงานอีก  งานต้องใช้สมองอย่างหนัก
เพราะว่าตอนนี้ที่ทำงานทะยอยกันลาออกจะหมดแล้ว
ความรู้สึกเคว้งมันมากขึ้นทุก ๆ วัน
ส่วนเรียนเกรดออกมาพอถูไถ  ตอนสอบเล่นไม่มีเวลาอ่านนินา
ยิ่งถ้าช่วงไหนเรียนกลับบ้านมาสลบทันที
เสาร์อาทิตย์แทนที่จะได้ไปเที่ยว แต่ต้องอยู่กะหนังสือ
สงสารตัวเองเหมือนกันแต่ทำไงได้อ่ะ เลือกเองที่จะทำแบบนี้
แล้ว….ถ้าไม่ดูแลตัวเองเลย  สุดท้ายแล้วก็ต้องเข้าโรงพยาบาลเหมือนเช่นเคย
 
เหนื่อยจะพูดกับคนที่ไม่เข้าใจ  แต่เอาเถอะอยากเข้าใจอะไรผิด ๆ ก็ตามใจ
ในเมื่อเขายังไม่เข้าใจในตัวเราแล้วจะไปแคร์คนที่ไม่เข้าใจในตัวเราทำไม
 

อีกปีแล้วสินะ…

•ธันวาคม 27, 2009 • 1 ความเห็น
นานเท่าไหร่แล้วนะที่ไม่ได้เล่าเรื่องราวที่ผ่านมา
ที่ผ่านมาเหนื่อยกับ….
การเริ่มต้นทำงาน เริ่มทำตอน 4 พฤษภาคม 2552
ช่วงเริ่มทำต้องปรับตัวสุด ๆ   ต้องทำให้ทันคนอื่นเขา
แถมต้องมาเขียนภาษาที่มีความรู้เป็น 0 กดดันมาก
กว่าจะปรับตัวได้ป่วยมาหลายรอบ
และก็ทำงานจนไม่มีเวลาเป็นของตัวเอง
รับปริญา  วันที่ 16 ธันวาคม 2552  เวลา 16.50
จะได้รับต้องซ้อมถึง 3 วันเต็ม  (เหนื่อยจะบ้า)
แถมกว่าจะได้เข้าหอประชุมต้องยืนรอถึง 3 ชม.
แต่ลองนับเวลาตั้งแต่ลุกขึ้นเพื่อที่จะขึ้นรับและลงมานั่งที่  ใช้เวลาไม่ถึง 2 นาที
เรียนป.โท  ก่อนสอบโดนลากไปอุบลมา
ไม่ไปไม่ได้ด้วยนิสิ  พ่อนี่โกรดจนไม่สบายไปเลย
บังคับกันสุด ๆ  แถมไปไม่มีอะไรดีขึ้นเสียเวลาเต็ม ๆ ไป 3 วัน
กลับมาก็ป่วยเนื่องจากร่างกายปรับไม่ทันกับอากาศ
มาถึงจุดนี้  รู้สึกเหนื่อยที่สุดเลย
คะแนนก็เลยออกมาเน่า ๆ  เซง

ps.ได้แต่ปลอบใจตัวเองว่าอดทนหน่อย อีกไม่นานเราก็จะสบายและ

รู้จักรัก

•กรกฎาคม 15, 2009 • 1 ความเห็น
การมีคนรัก
ไม่ได้หมายความว่าคุณรู้จักรัก

ความรู้สึกแสนดี
การมีเรื่องประทับใจ
ได้ช่วยกันสานสายใยผูกพัน
เป็นเพียงเปลือกนอกของความรัก

เนื้อแท้ของความรัก
คือการมีกันและกันในยามยาก

แก่นสารของความรัก
คือการรู้ทางที่จะร่วมกอดคอ
เดินหน้าไปสู่ความดับทุกข์
ไม่เหลือแม้้น้ำตาอาลัยกันในยามตาย

คนที่ใช่

•เมษายน 7, 2009 • ให้ความเห็น
โดดเดี่ยวเดียวดายให้มีสุข     
ความรักของเราแต่ละคนอาจเริ่มต้นจากการพบกันโดยบังเอิญ
มีเพื่อนแนะนำให้รู้จักกันตอนไปงานเลี้ยง งานวันเกิดเพื่อน
ทำงานที่เดียวกัน   หรือรู้จักมักคุ้นกันตั้งแต่ยังเด็ก ฯลฯ
 
ไม่ว่าเราจะพบเจอกันด้วยเหตุการณ์แบบไหน
การเริ่มต้นของความรักก็มักเริ่มจากความสุขและความงดงามเสมอ
 มีความทรงจำและความประทับใจในกันและกันจนต้องสานสัมพันธ์ต่อ
ทำความรู้จักตั้งแต่ผิวเผินจนมาเป็นคนรักกันในที่สุด
 
แต่ใครจะไปรู้ว่าความรักครั้งนี้จะลงเอยอย่างไร
ไม่ว่าจุดเริ่มต้นจะเป็นเช่นไร สุดท้ายก็มีแต่ความเศร้าอยู่ดี
แม้เราจะพยายามทำใจให้ยอมรับกับความไม่แน่นอนบ้างแล้วส่วนหนึ่ง
แต่เมื่อถึงเวลานั้นจริงๆ ก็ไม่มีใครห้ามน้ำตาไม่ให้มันไหลได้เลยสักคน
 
 ความรักนั้นมักถูกมองว่าเป็นเรื่องใหญ่ที่สุดอย่างหนึ่งในชีวิต
 จึงไม่ใช่เรื่องแปลกที่ทุกคนจะให้ความสำคัญกับมันมากเป็นพิเศษ
 และพยายามสืบเสาะหาใครคนนั้นที่จะมาเป็นคู่ชีวิต
เพื่อที่จะมาร่วมสร้างความสุข   เสียงหัวเราะ   มอบรอยยิ้ม 
มอบสิ่งดีๆ ให้แก่กัน สร้างอนาคตที่สดใส
ใช้วันคืนและแบ่งปันความสุขความทุกข์ที่มีร่วมกัน
  
เมื่อถึงวันนั้นเราจึงต้องพยายามทำทุกวิถีทางเพื่อให้มันอยู่กับเราไปนานๆ
แต่ความรักมันก็เหมือนเรื่องอื่นๆ ในชีวิตที่เราได้แต่ทำให้ดีที่สุดเท่านั้น
รักกันให้ดีๆ ทำแต่สิ่งดีๆ   พูดแต่สิ่งดีๆ   มอบแต่สิ่งดีๆ ให้คนที่เรารัก
 
แต่มันจะลงเอยอย่างไรก็เป็นเรื่องของอนาคตที่ไม่อาจกำหนดผลได้
จะสมหวังหรือผิดหวังก็เป็นเพียงสิ่งที่สามารถจะเกิดขึ้นได้ทั้งสองทาง
เราคงไม่อาจไปทัดทานอะไรได้
 
หากเขาเป็นคนที่ใช่…สุดท้ายมันก็คือใช่
แต่หากเขาไม่ใช่…จะยื้ออย่างไรก็คงอยู่กับเราได้ไม่นานนัก
กับคำถามที่ว่าความรักมักเริ่มต้นด้วยความสุข และจุดจบจะต้องเศร้า
จึงไม่ใช่เรื่องจริงเสมอไป. . .
 

เหนื่อย

•มีนาคม 5, 2009 • ให้ความเห็น
 
 
เหนื่อยจนบอกไม่ถูก….
 
แต่ก็ยังทนทำต่อไป
 
ที่ยังทนก็เพราะ  พ่อและแม่ 
 
อยากให้เขายิ้ม  และภูมิใจ 
 
อาจจะไม่ใช่คนที่แสนดี 100 เปอร์เซน
 
แต่ทุกอย่างที่ทำไป
 
ทำด้วยข้างในจิตใจ
 
ไม่ใช่การเสแสร้งแกล้งทำ