หน้าเว็บ

วันจันทร์ที่ 28 พฤศจิกายน พ.ศ. 2554

Database Trigger คืออะไร ทำงานอย่างไร


        Database Trigger นั้นหมายถึงโปรแกรม PL/SQL ที่อยู่ในลักษณะของ Name Block ที่ถูกสร้างและจัดเก็บไว้ในระบบฐานข้อมูล
โดยการทำงานของ Database Trigger นั้นจะทำงานเองโดยอัตโนมัติเมื่อมี Trigger Events เกิดขึ้น

Trigger Events คืออะไร ?

        Trigger Events หมายถึงการที่มีเหตุการณ์บางอย่างเกิดขึ้นกับ table, schema, database หรือ system  เช่นมีการใช้คำสั่ง DML คือ insert, update, หรือ delete มากระทำต่อ table ที่เราได้เขียน database trigger ผูกเอาไว้  ก็จะทำให้ database trigger นั้นเกิดการทำงานโดยอัตโนมัติตามคำสั่ง PL/SQL ที่เราได้เขียนไว้นั่นเอง   หรือเช่นการ Login เข้าสู่ระบบ(Database server) ถ้าหากเราได้เขียน Database Trigger ที่เกี่ยวกับการ Login เอาไว้ในระบบ  มันก็จะทำงานเองโดยอัตโนมัติเมื่อมี User Login เข้าสู่ระบบ

ตัวอย่างโจทย์

        เช่น  หากมีการเปลี่ยนแปลงเงินเดือนให้กับพนักงานของบริษัท  เจ้าของบริษัทต้องการให้ back up ข้อมูลของพนักงาน  จำนวนของเงินเดือนก่อนเปลี่ยนแปลง  จำนวนเงินเดือนใหม่ที่เปลี่ยนแปลงแล้ว  วันเวลาที่ได้ทำการเปลี่ยนแปลงเงินเดือน และชื่อของ database user ที่ทำหน้าที่เปลี่ยนแปลงเงินเดือนเก็บไว้ในฐานข้อมูล 


เราสมมติว่า table Employees ดังรูปข้างล่างนี้  เราได้เขียน Database Trigger สำหรับ back up ข้อมูลพนักงานและข้อมูลเงินเดือนผูกเอาไว้น่ะครับ


จากนั้นทำการเพิ่มเงินเดือนให้กับพนักงานชื่อ peter จาก 20,000 เป็น 25,000

Update Employees
Set Salary=25000
Where Employee_id=’1234’

เงินเดือนของ peter ก็จะเปลี่ยนจาก 20,000 เป็น 25,000


        ในตอนนั้นเองก็ได้มี Trigger Events เกิดขึ้น  เนื่องจากว่าเรามีการใช้คำสั่ง update กับ table ที่เราได้เขียน database trigger ผูกเอาไว้  ตัวโปรแกรม database trigger ก็จะทำงานอยู่เบื้องหลังโดยอัตโนมัติ คือ มีการ back up ข้อมูลพนักงานและข้อมูลเงินเดือนเก็บไว้เรียบร้อยแล้ว

            ที่ table BackupSalary


จะเห็นว่า  ได้มีการ back up ข้อมูลต่างๆเก็บไว้แล้วโดยอัตโนมัติ


ทฤษฎีผ่านไปแล้ว  เรามาดูการทำงานจริงๆกันดีกว่าครับ

ผมใช้ Oracle Database 11g R2  น่ะครับ
เริ่มแรกก็เปิด SQL Developer ขึ้นมา




        เดี๋ยวผมจะลองทดสอบในตาราง Employees ที่ผมมีอยู่แล้วน่ะครับ  โดยจะทำการทดสอบเพิ่มเงินเดือนให้กับพนักงานเหมือนตัวอย่างที่ได้กล่าวไปแล้ว
        อันนี้คือตาราง Employees ครับ  field หรือ attribulte อาจจะเยอะกว่าตัวอย่างที่ได้กล่าวไป  แต่ก็ไม่เป็นไรครับ






ตอนแรกผมทำการสร้าง table สำหรับ back up ข้อมูลของพนักงานและข้อมูลเงินเดือนขึ้นมาก่อน
ชื่อ table ว่า Employees_Salary_Backup



จากนั้นก็เขียนโค๊ด Database Trigger ผูกติดกับ table Employees 



 TRIGGER TG_EMPLOYEES_SALARY_BACKUP
 BEFORE UPDATE OF SALARY ON EMPLOYEES  
บรรทัดนี้บอกว่า  สร้าง Trigger ชื่อว่า  TG_EMPLOYEES_SALARY_BACKUP 
    และให้ Trigger ทำงานก่อนที่จะทำการ UPDATE เงินเดือนในตาราง EMPLOYEES 

---------------------------------------------------------------------------------------------------------

BEGIN
              INSERT INTO employees_salary_backup
              VALUES(:old.employee_id , :old.first_name||' '|| :old.last_name , :old.salary , :new.salary , sysdate , ORA_LOGIN_USER);
END;

บรรทัดนี้คือส่วนหลักที่จะทำงานเมื่อมี Trigger Events เกิดขึ้น  ก็คือให้ Insert ข้อมูลลงในตาราง  employees_salary_backup  หรือเรียกว่าเป็นการ backup ข้อมูลนั่นเอง


--------------------------------------------------------------------------------------------------------
เรามาลองทำการเปลี่ยนแปลงเงินเดือนกันดูครับ
ผมจะเพิ่มเงินเดือนในกับพนักงานซึ่งมี id = 200  จาก 4,400 เป็น 10,000





ดูผลลัพธ์การเปลี่ยนแปลง


จากนั้นไปดูค่าในตาราง EMPLOYEES_SALARY_BACKUP




        Trigger จะเกิดการทำงานเองโดยอัตโนมัติ  โดยทำการ back up ข้อมูลต่างๆ เก็บไว้  เมื่อเรามีการ Update เงินเดือนของพนักงานเกิดขึ้น


        เป็นยังไงกันบ้างครับ  หวังว่าคงจะพอรู้จักและเข้าใจการทำงานของ Database Trigger กันบ้างแล้วน่ะครับ  ส่วนวิธีการเขียนโปรแกรมก็ต้องไปศึกษาหาความรู้กันเอาเองครับผม  ^____^




8 ความคิดเห็น:

  1. ไม่ระบุชื่อ30 พฤษภาคม 2555 21:28

    ขอบคุณครับ trigger ดีอย่างนี้เอง :-)

    ตอบลบ
  2. เยี่ยมเลยครับ ขอบคุณที่แบ่งบันครับ

    ตอบลบ
  3. ด้วยความยินดีครับ

    ตอบลบ
  4. เยี่ยมครับ อธิบายเข้าใจง่ายมากครับ #ขอบคุณครับ

    ตอบลบ
  5. แล้วมีทริคเกอร์ที่แบบให้ insert เฉพาะตัวอักษรไม่ให้ใส่ตัวเลขหรือเปล่าครับ

    ตอบลบ
    คำตอบ
    1. ต้องเขียน logic เองครับ :)

      ลบ
  6. ไม่ระบุชื่อ31 พฤษภาคม 2560 21:44

    ดีมากเลยครับ ปกติผมต้องเขียนมาตรวจเช็คเองหรือเช็คค่าบางอย่าง วุ่ยวาย เพิ่งเข้าใจก็วันนี้ ประหยัดเวลาได้เยอะครับ

    ตอบลบ