[DB2] Query สำหรับค้นหาว่า Column ที่ต้องการอยู่ใน Table อะไรบ้าง



ตอนแรกก็ไม่ได้เอ๊ะในอะไร คิดว่าเป็นเพียงแค่ชื่อ ธรรมดา แต่พอแก้ชื่อ Error เลย ผมเลยลองหาข้อแต่ต่างของ BEGIN ATOMIC ว่าต่างกับเจ้า BEGIN ธรรมดาอย่างไร โดยคำสั่ง BEGIN ATOMIC มีการจัดการ Transaction เ้สริมเข้ามา ถ้าคำสั่งภายใต้ BEGIN ATOMIC … END นั้นเกิดปัญหาขึ้น DBMS จะ ROLLBACK ข้อมูลกลับทั้งหมดครับ ตัวอย่างการใช้งาน เช่น

จริงๆผมก็ไม่ได้จบสาย Network นะ แต่บริษัทญาติที่ได้ไปช่วยดูแล และทำ App ใช้งานในองค์กรมาตั้งแต่ปี2 เกิดอยากจะทดสอบระบบขึ้นมา ว่ามีความปลอดภัยมากแค่ไหน ผมเลยลองหาข้อมูลเพิ่มเติม และถามผู้รู้ดูครับ ได้พบกับ keyword 2 คำว่า ได้แก่ Hardening และ Security Audit ซึ่งแค่ละคำมีความหมาย ดังนี้ครับ Hardening คือ ? Hardening คือ เพิ่มความแข็งแกร่งให้กับระบบ โดยต้องมองว่า System ของเรานั่นไม่มีความปลอดภัยเลย เราจะเพิ่มความมั่นใจให้ระบบของเรามีความปลอดภัยตามจุดมุ่งหมาย 3 อย่าง ได้แก่ ความลับ (Confidentiality), ความสมบูรณ์ (Integrity) และ ความพร้อมใช้(Availability) เกิดจากการลองทำ Vulnerability Assessment, Penetration Testing และ Risk Management เพื่อหาช่องโหว่ หรือจุดอ่อนของระบบนั่นเองครับ (ตรงนี้มี Tools หลายๆเจ้าช่วยตรวจนะ) จากนั้นกระทำบางอย่าง เพื่อป้องกันปัญหาที่เกิดขึ้นจากการทดสอบ เช่น Security Audit คือ ? Security Audit คือ การตรวจสอบระบบ ว่าสิ่งที่ได้ เพิ่มเติมมาจากการทำ Hardening นั้นมัน Secure เพียงพอ หรือไม่ (ที่ใช้คำว่า Secure เพียงพอ เพราะ ไม่มีระบบไหน ที่ปลอดภัยได้ 100% ครับ) หรือ ถ้ามองอีกแง่จะเป็นการ Control(อันนี้กว้างมากครับ มองได้หลายแง่มุมทั้งการจัดการ Infrastructure, Traffic หรือถ้าเป็นในแง่ของ Developer ต้องจัดการสิทธิต่างๆในการเข้าใช้งานฐานข้อมููลให้เหมาะสม ไม่ใช่ว่า 1 user สามารถยุ่งกับ Schema ทั้งหมดใน Database Server ได้ เป็นต้น) โดยอีกตามมาตรฐานความปลอดภัยต่างๆ เช่น …

งานช่วงนี้ของผมมีแก้ Report บ้าง โดยใน Report อันนี้เป็นการบอกสถานะของ User ว่าต้องมี Message แจ้งเตือนอะไรบ้าง ได้แก่ จากข้อมูลคร่าวๆนี้ หลายๆคนตอนออกแบบ Layout อาจจะแยก 3 Message ออกเป็น 3 formula ซึ่งมาถึงตรงนี้ อาจจะพบว่าปัญหาว่า User บางคน มีแต่ 2 Message ทำให้การแสดงผลมันดูแหว่งๆ และไม่สวยงามครับ (ตัวอย่างในรูปพบว่าพื้นที่สีเหลืองที่ hilight คือ พื้นที่ที่แหว่งไป ถ้าไม่มีคำว่า “- User must change password at next login.” แสดงผลอีกมันคงดูแปลกๆนะครับ)ทางแก้ของผม คือ เวลาสร้าง Formula ก็ให้เก็บ Message แต่ละอันไว้ในตัวแปรก่อน แล้วค่อยนำมาแสดงผลทีเดียวครับ ดังนี้ ผลลัพธ์ที่ได้ครับ ไม่มีบรรทัดว่างแล้วครับ หมายเหตุ:


วันนี้ผมนั่งทำงานเขียน Code เขียน Query อย่างเบลอๆ พอลองมา Test Program ปุบ เจอ Error Message แจ้งเตือน ดังรูป โดยเจ้า Error Message นี้ เป็นการบอกว่า Table ของเราอยู่สถานะ Pending รอการ REORG TABLE (สำหรับคนที่ส่งสัยว่า REORG คือ อะไร ให้ตามไปอ่านกันครับ) ซึ่งมีสาเหตุ มาจากการที่ผมไปแก้ Datatype ของ Column ‘USERDESC’ ใน Table จาก varchar(30) ไปเป็น varchar(3oo) ครับ ส่วนทางแก้ไข ก็ง่ายๆครับ แต่รันคำสั่ง REORG TABLE ที่เกิดปัญหา จากนั้นลอง Query ดูพบว่าสามารถใช้งานได้แล้วครับ Reference

สำหรับ DEV หรือ DBA มือใหม่ เมื่อได้สร้าง Table แล้ว เกิดต้องมีเหตุ กลับเข้ามาแก้ไขโครงสร้างของ Table อาจจะเกิดการ Change Requirement (จริงๆ จะแก้อะไรมันก็มาจากกรณีนี้เยอะมาก 555) หรือ ปรับโครงสร้างเพื่อเพิ่ม Performance เป็นต้น จะพบว่าตัว SQL Server เอง มันไม่ยอมให้เราแก้ไข โดยมี Message แจ้ง ดังรูป ก่อนที่เราจะรู้วิธีการแก้ไข ผมว่าเรามารู้ถึงสาเหตุดีกว่า ทำไมตัว SQL Server ถึงไม่ให้ก่อนดีว่า เพราะเนื่องจากบาง Operation ต้องมีการ Re-Created Table ใหม่ ซึ่งส่งผลกับ Data เดิมที่มีอยู่ใน Table เนื่องจากในบางกรณี เช่น การเปลี่ยน Data type ของข้อมูลใหม่ ถ้าเป็นข้อมูลประเภทตัวเลข อาจจะส่งผลถึงค่าพวกทศนิยม หรือการปัดเป็นจำนวนเต็ม จนทำให้ข้อมูลผิดพลาดได้ เป็นต้น โดยกลุ่มของ Operation ที่สางผลให้มีการ Re-Created Table ใหม่ จากประสบการณ์ที่ผมเจอมา มีดังนี้ พอรู้ถึงสาเหตุแล้ว ก็มาวิธีแก้ไขบ้าง โดยทำตามขั้นตอน ดังนี้ โดยตัวอย่างที่ผมได้ทดสอบ คือ การปรับแก้ Data Type ของ Column “OBJECTNAME” จากเดิม nchar(100) ไปเป็น nchar(200)

ถ้าคนที่เคยใช้ DB2 มา จะพบว่าตัว Database Manager ที่ใช้ในการจัดการ Query ต่างๆ มันช้า และไม่มี Feature ที่ช่วย User ได้ดีอย่างทางฝั่ง SQL Server และ Oracle และหลายๆคนก็น่าเคยใช้ Tools ตัวนึงที่ชื่อว่า Toad for DB2 กัน โดยวันนี้ผมมาแนะนำวิธีการ Setup DB Connection ครับ กรณีที่โปรแกรม ไม่สามารถไปดึงข้อมูลจาก ODBC ที่ตั้งไว้ครับ

วันนี้มาเขียน Blog ดึกไปหน่อย ถือว่าฉลองเดือนธันวาคมที่แสนอบอุ่นและกัน 555 มาเข้าเรื่องกัน โดยหลายๆครั้งที่เราต้องพัฒนา Console App เพื่อทำงานในลักษณะที่เป็น Background Process ถ้าเป็นการเรียกใช้งานผ่านตัว User หรือ Application อื่นๆ อย่าง WinForms โดยตรงมันก็ไม่มีปัญหาอะไรนัก แต่ถ้าเป็นการเรียกใช้ผ่าน Task Schedule หละ ? ปัญหาของผม คือ ว่า เราจะทำให้ตัว Task Schedule (หรืออาจจะเป็น App อื่นที่เรียกใช้ใน Batch) รู้ได้อย่างไรว่า Exe ที่เรียกใข้งาน มันทำงานเสร็จแล้ว ? ในตอนแรก ผมคิดว่าต้อง Kill Process นี้ทิ่งด้วยคำสั่ง แต่สิ่งที่ผมคิดนั้น มันผิด เพราะตัว Caller อย่าง Task Schedule มันไม่รู้ว่าไฟล์ .exe ของเราเนี่ย ทำงานเสร็จ หรือยัง ทำให้เมื่่อถือเวลาที่ Schedule นั้นต้องทำงานอีกรอบ ระบบได้ไปสร้าง Thread ใหม่ขึ้นมาทำงานขนานกัน ซึ่ง Task ของผมตั้งให้มันทำงานทุกๆ 1 ชั่วโมง แต่ละครั้งมันจะใช้ Memory ประมาณ 500 MB ถ้าเจ้า Task Schedule มันไปสร้าง Thread ใหม่อีก 10 ครั้งหละ ? !!! System down !!! ลองไล่ดูอีกทีเราจะพบว่าทำไมระบบถึง Down ได้ สาเหตุเพราะว่าเจ้า Task Schedule มันไปสร้าง Task งานทุกๆ 1 ชั่วโมง ผ่านไป 10 ชั่วโมง…

น่าจะเป็น Blog แรกของเดือนนี้มั้งที่ได้ Public พอดีช่วงนี้งานเยอะ เลยไม่ได้มาเขียนบ่อยๆ เขาเรื่องเลยและกัน คือ งานชิ้นปัจจุบันของผมใช้งาน Database DB2 ของ IBM ใช้ไปใช้มาพอถึงวันนึง จะ Delete ข้อมูลเท่านั้นแหละ ระบบได้แจ้ง Message เตือนขึ้นมา ดังรูป ก่อนจะเข้าเรืองกัน เราควรจะมีรู้เรื่องก่อนว่าเจ้า Transaction log คือ อะไร โดยตัว Transaction log มัน คือ บันทึกการทำงานของ Database เราทุกอย่างตั้งแต่ INSERT, UPDATE, DELETE หรือจะเป็นการแก้ไขโครงสร้างข้อมูลครับข้อมูล Log ที่เก็บไว้พวกนี้จะมีประโยชน์ในการใช้ Recovery Database ตอนที่ฐานข้อมูลของเราเกิดปัญหาครับ คราวนี้กลับมาที่ DB2 กันบ้าง โดยทางแก้ในการจัดการปัญหา SQL0964C Transaction log for database is full คือ การปรับแก้ Parameter LOGFILSIZ, LOGPRIMARY และ LOGSECOND เพื่อเพิ่มพื้นที่การจัดการกับ Transaction log ครับ โดยมีขั้นตอนคร่าวๆ ดังนี้ จากนั้นเราลองมาแก้ค่า Parameter ของแต่ละตัวกันครับ เมื่อแก้ไขข้อมูลครบถ้วนแล้ว เราก็ Restart Database ด้วยคำสั่ง db2stop และ db2start ก็เป็นอันเรียบร้อยครับ (อย่าลืมตรวจสอบว่ามีคนใช้งาน DB อยู่ หรือป่าวนะครับ ฮ่าๆ) วิธีนี้เป็นวิธิหนึ่งในการแก้ไขนะครับ โดยจะเป็นการขยายพื้นที่เพิ่มสำหรับเก็บ Log แต่จริงๆ ยังมีวิธีดู DB ด้วย db2pd จะได้ kill AppI Id ที่ update /…