01 มิถุนายน 2550

ลบข้อมูลหลอกๆ ใน SQL Server

จั่วหัวก็หลอกกันซะแล้ว ปรกติ เวลาเราใช้คำสั่ง DELETE FROM < table_name >WHERE .... พอสั่งจบปุ๊บข้อมูลหายปั๊บ ยิ่งถ้าเผลอไปพิมพ์แค่ DELETE FROM < table_name >โดยไม่กำหนด WHERE ทำไงดีล่ะ เรียบร้อยโรงเรียน กำสำ (delete พิมพ์แบบไทยแทนน่ะ) ต้องนั่งน้ำตาตก
อย่ากระนั้นเลย เรามีวิธีเร่เข้ามาทางนั้น ลบแล้วไม่ลบ ลบหลอกๆ งานนี้ต้องอาศัย TRIGGER เขาช่วย
ก่อนอื่นตารางทุกตารางต้องเพิ่ม Column เข้า 1 คอลัมน์ ให้ชื่อว่า Deleted มีประเภทข้อมูลเป็น CHAR(1) ถ้าไม่รู้จะเพิ่มอย่างไร ก็ใช้คำสั่ง ALTER ตามนี้

ALTER TABLE < table_name >
ADD Deleted char(1) NULL

**** ย้ำ < table_name > ไปเปลี่ยนเป็นชื่อตารางเอาเองน่ะ

หลังจากที่เพิ่มคอลัมน์ให้กับตารางต่างๆเป็นที่เรียบร้อย ทีนี้จะทำกับตารางไหนบ้างก็ต้องสร้างทริกเกอร์คุมแต่ละตารางเอาเองน่ะ โดยสร้างดังนี้

CREATE TRIGGER < trigger_name >
ON < table_name >
INSTEAD OF DELETE
AS
IF @@ROWCOUNT = 0 RETURN
UPDATE b SET b.Deleted = 'Y' FROM dbo.Books b JOIN deleted d ON d.< primary_key > = b.< primary_key >

**** ย้ำอีกรอบ ที่ต้องย้ำคนไทยเป็นคนเข้าใจอะไรยาก ขนาดศาลตัดสินว่าผิด ยังไม่เข้าใจเลยเฮ้ออ
< trigger_name > เป็นชื่อทริกเกอร์ที่ตั้งขึ้นเอง
< table_name > ชื่อตารางที่เก็บทริกเกอร์
< primary_key > ชื่อคอลัมน์ที่เป็น Primary key

เมื่อสร้างเสร็จ ตานี้แหละ ลบอย่างไรก็ไม่หายอิๆๆๆ

ตัวทริกเกอร์จะเปลี่ยนจากการ delete แถว(เรคคอร์ด) ไปเป็นการ update โดยใส่ค่า 'Y' ไว้ในคอลัมน์ Deleted แทน อิๆๆ เท่านี้ข้อมูลก็อยู่ครบ

อ้าวเกิดปัญหาตามมาอีกเวลาเรียกดูมันก็โผล่ออกมาอีก ทำไงดี ก็ต้องไปสร้างวิว เพื่อกรองเฉพาะแถวที่มีค่าของคอลัมน์ Deleted ที่ไม่เป็น 'Y' ดังนี้

CREATE VIEW < view_name >
AS
SELECT * FROM < table_name >
WHERE Deleted IS NULL OR Deleted < > 'Y'

**** ย้ำ ไม่ย้ำแล้วดีกว่า สองครั้งก็น่าจะพอ

เวลาที่เราจะไปใช้งานจริง เราก็อ้างจาก View ที่เราสร้างแทนการใช้ talble จริง
อิๆๆ เท่านี้การลบก็จะไม่ถูกลบ
แล้วถ้าจะลบจริงล่ะทำไงดี ก็ต้อง หยุด(disable) trigger ที่คุมการ delete ไว้ชั่วคราวก่อน ดังนี้

ALTER TABLE < table_name >
DISABLE TRIGGERS < trigger_name >

จากนั้นก็ค่อยลบข้อมูลทีมีค่า Deleted = 'Y' ออก ดังนี้

DELETE FROM < table_name > WHERE Deleted = 'Y'

เป็นอันลบข้อมูลที่ถูกลบหลอกๆ ทิ้งไปจริงๆ

จากนั้นก็ค่อยมาให้ระบบเริ่ม(enable) trigger ที่หยุดไว้ใหม่ ดังนี้

ALTER TABLE < table_name >
ENABLE TRIGGERS < trigger_name >

เป็นอย่างไรบ้าง ลบหลอกๆ สุดท้ายก็ต้องโดนลบจริง
หวังว่าคงจะได้แนวคิดไปหลอกไม่มากก็น้อย

สวัสดีมีชัย คิดสิ่งใดแล้วทำก็ขอให้สมหวัง (คิดแล้วไม่ทำยังไงมันไม่สมหวังหรอก)
"I Believe in You"

Copyright(c) 2007 - 2022 by Kasem Kamolchaipisit.