Wednesday, August 18, 2010

Database object naming standard

สำหรับ Standard ในการตั้งชื่อ Object ในฐานข้อมูล SQL Server 2005 มีดังต่อไปนี้

Use names that comply with the rules for forming SQL Server 2005 identifiers
ใน Microsoft SQL Server 2005 อ้างถึง database name ว่าเป็น identifiers ซึ่ง แบ่งเป็น 2 classes คือ delimited และ regular
Delimited identifiers คือ การครอบด้วย brackets ([]) หรือ double quotation marks (“”) ซึ่งสามารถใช้กับ characters ใดๆ ก็ได้
Regular identifiers มี กฏ ดังนี้
  1. Character แรกต้องเป็น Latin character จาก a ถึง z หรือ จาก A ถึง Z, ตัวอักษรจากภาษาอื่นๆ หรือ underscore (_) character ไม่สามารถใช้ @, # ใน character แรกได้ เนื่องจาก @ หมายถึง local variable ส่วน # และ ## ใช้กับ temporary table
  2. Characters อื่นๆ นอกจาก character แรก สามารถเป็นตัวอักษรใดๆ ก็ได้ เช่น ตัวเลข Latin, @, $, _ แต่ ช่องว่าง (space) และ character พิเศษไม่สามารถใช้ได้
  3. Identifier ต้องไม่ใช่คำสงวน (Reserved word) ของ Transact-SQL
ควรใช้ regular identifiers ในการตั้งชื่อ database objects เพื่อหลีกเลี่ยงที่จะต้องใช้ delimiters ในทุกๆ object name และ เพื่อง่ายในการ code และ อ่าน

Use descriptive terms
การตั้งชื่อ ควรสั้น และ มีความหมาย มีความชัดเจน เช่น ชื่อ table, view หรือ stored procedure ตัวอย่างการตั้งชื่อ table ที่ประกอบด้วย employee information การใช้ชื่อ Employees, Employee หรือ tblEmployee นั้น ดูมีความหมายกว่า TVHREMP (T=Table, V=Vase Project, HR=Human Resources, EMP=Employee) แม้ว่าตัวอักษรจะดูมีรูปแบบ แต่ไม่สามารถให้ความหมายได้ เมื่อใช้ชื่อที่ง่ายและมีความหมาย จะทำให้ users, developers และ database administrators สามารถจดจำได้ว่าเป็น identify ใด

Use only standard abbreviations in names
ในการตั้งชื่อ ควรใช้คำย่อที่รู้จักกันดี และหลีกเลี่ยงการใช้คำย่อที่ไม่เป็นมาตรฐาน ตัวอย่างเช่น Org เป็นคำย่อของ Organization

Name intersection tables consistently
เมื่อมีการสร้างมาตรฐานการตั้งชื่อ จะต้องระบุวิธีการตั้งชื่อ Intersection table ซึ่งเป็น table ที่ใช้สำหรับเป็นตัวแทนความสัมพันธ์ระหว่าง many-to-many โดยทั่วไปแล้วจะใช้วิธีรวมชื่อ entities ที่ refer กันเข้าไว้ด้วยกัน เช่น ความสัมพันธ์ระหว่าง Countries และ Languages อาจใช้คำว่า CountriesLanguages

Be consistent across all objects
เพื่อให้แน่ใจว่าการตั้งชื่อเป็นไปตามมาตรฐาน ทุกๆ Objects ใน database จะต้องมีการตรวจสอบชื่อของ objects โดยกำหนดเป็นส่วนหนึ่งของการทำการควบคุมคุณภาพ (quality-control) ถ้าชื่อไม่ได้เป็นไปตามมาตรฐาน จะต้องอยู่ใน bug list และจะต้องทำการแก้ไขก่อนที่จะเข้าสู่กระบวนการ development

Document and communicate naming standards
ควรกำหนดมาตรฐานในการตั้งชื่อและจัดทำเป็นเอกสารอย่างละเอียด และ ให้สมาชิกในทีมรวมทั้ง stakeholders รับทราบ ซึ่งมาตรฐานในการตั้งชื่อนั้นควรให้ stakeholders ทุกคนทำความเข้าใจอย่างชัดเจน
ในการจัดทำเอกสารนั้น ต้องมี “Quick Reference” กับ มีการอธิบายรายละเอียดของมาตรฐานในการตั้งชื่อและตัวอย่างด้วย อีกทั้งควรมีแทรกการสอนมาตรฐานการตั้งชื่อให้กับสมาชิกใหม่ในขณะที่ทำการฝึกอบรมด้วย

NooM

Database Auditing

เพื่อป้องกันการปฏิเสธการกระทำของ users (non-repudiability) เช่น ถ้า user บังเอิญลบรายการ และเขาปฏิเสธว่าไม่ได้กระทำ เราจะต้องมีกระบวนการที่จะทำให้ user ไม่สามารถปฏิเสธในสิ่งที่เขากระทำได้
การเพิ่ม application auditing จะช่วยในการควบคุมและป้องกัน non-repudiability ได้ โดยอาจใช้ DDL trigger และ การกำหนด permission ให้เหมาะสม

Audit patterns
การ audit เพื่อป้องกัน non-repudiability มีรูปแบบ ดังนี้

Simple audit in columns
ทำการเพิ่ม columns ใน table อย่างน้อย 4 columns ประกอบด้วย
1. user ผู้บันทึกข้อมูล
2. วัน เวลา ที่บันทึกข้อมูล
3. user ผู้ปรับปรุงข้อมูล
4. วัน เวลา ที่ปรับปรุงข้อมูล
รูปแบบนี้เป็นรูปแบบพื้นฐานที่สุดในการ audit และจะทราบได้เพียงผู้ปรับปรุงครั้งสุดท้ายเท่านั้น ซึ่งไม่สามารถทราบผู้ปรับปรุงก่อนหน้าได้

Simple audit in tables
ทำการเก็บข้อมูลการเปลี่ยนทั้งหมดของ table ต่างๆในฐานข้อมูล ลง table ที่เก็บ audit log รูปแบบนี้ช่วยให้สามารถทราบจำนวนของการปรับปรุง และ ผู้ทำการปรับปรุงแต่ละครั้งได้

History table
กรณีที่ต้องการเก็บการเปลี่ยนแปลงทั้งหมด (full audit log) อาจจะต้องสร้าง history tables ที่เหมือนกับ table ที่จะ audit เมื่อมีการ insert, update และ delete ข้อมูล ก็จะมีการเก็บข้อมูลไว้ใน history table ซึ่งใน history table จะประกอบด้วย columns ทั้งหมดเหมือน original table, long integer identity หรือ GUID column ที่เป็น primary key, user และ date columns
รูปแบบนี้มีประโยชน์มากสำหรับ table ที่ต้องการการควบคุมการเปลี่ยนแปลงข้อมูล และต้องการทราบประวัติของข้อมูลย้อนหลังด้วย

Audit log table with and XML column
โดยการสร้าง audit table ซึ่งประกอบด้วย 2 column ประกอบด้วย table name และ XML column ซึ่งเก็บข้อมูลการเปลี่ยนแปลงทั้งหมดในรูปแบบของ XML เนื่องจากว่า SQL Server 2005 มีการจัดการ XML ที่ดีขึ้น จึงสามารถจัดเก็บเป็น XML ได้

NooM

Data Protection and Data Encryption

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

บทความนี้เป็นบทความเกี่ยวกับการทำ Data Protection และ Data Encryption โดยอธิบายในแบบกว้างๆ เพื่อให้ได้เห็นภาพของรูปแบบต่างๆ ของการทำ Protection และ Encryption ข้อมูล

Data Protection
สำหรับ Database design นั้น การพิจารณาเรื่อง Security จะต้องตระหนักถึง performance ด้วย ถ้า design ให้มี security มากๆแล้ว ก็จะทำให้ performance ลดลงได้ ดังนั้น จึงควร design data protection methods ที่จะกระทบกับ database performance ให้น้อยที่สุด

จุดมุ่งหมายหลักของ database security คือ data protection ซึ่งประกอบด้วย 3 องค์ประกอบหลักคือ
  • Confidentiality คือ การรักษาความลับของข้อมูล สามารถ access ได้เฉพาะ users ที่มีสิทธิเท่านั้น
  • Integrity คือ ข้อมูลไม่มีการเปลี่ยนแปลง มีความบูรณภาพ แท้จริง สามารถเชื่อถือได้
  • Non-repudiability คือ มีกลไกจัดการที่ users ไม่สามารถปฏิเสธได้

กลยุทธ์ในการทำ Designing data protection
Use views to hide data
ใช้ views เพื่อจัดการซ่อนข้อมูลที่ต้องการ protect ไว้ เช่น ถ้าไม่ต้องการให้ employees สามารถ access ข้อมูล invoices ย้อนหลังเกิน 24 ชั่วโมงไปแล้ว สามารถสร้าง view โดยระบุเงื่อนไขที่ต้องการไว้ใน WHERE ว่า InvoiceDate>DateAdd(day, -1, GetDate()) และ ให้สิทธิ (grant) ในการ access ได้เฉพาะ view ไม่ให้สิทธิในการ access ตัว table หลัก

Use the WITH CHECK OPTION in views
ถ้าใช้ WITH CHECK OPTION แล้ว จะสามารถจำกัดการแก้ไข rows ใน view ได้ เพราะถ้ามีการแก้ไขข้อมูลใน view การแก้ไขนั้นจะต้องเป็น row ที่อยู่ในเงื่อนไข WHERE เท่านั้น
** ถ้าไม่กำหนด Option นี้ไว้แล้ว users ก็จะยังสามารถแก้ไขข้อมูลที่ไม่ได้แสดงใน view ได้

Use stored procedures to protect data
สามารถใช้ stored procedures โดยการ ปฏิเสธ (deny) การ access แบบ direct ไปยังข้อมูลได้ นอกจากนี้ การใช้ stored procedures ยังมีประสิทธิภาพ (effective) มากกว่า views อีกด้วย
เนื่องจาก stored procedures นั้นใช้ภาษา Transact-SQL ในการ code จึงสามารถเขียน logic ที่ซับซ้อนกว่าที่ views สามารถทำได้

Data encryption
การทำ data encryption เป็นเทคนิคหลักที่ใช้ในการจัดการรักษาความลับของข้อมูล ในการวิเคราะห์ความต้องการสำหรับการทำ data encryption นั้นควรทำการวิเคาระห์จาก business requirements
SQL Server 2005 ได้จัดเตรียมการ encryption และ การจัดการ key infrastructure เพื่อให้ developers ใช้ใน Transact-SQL ในการ encrypt ข้อมูลได้

สามารถใช้ EncryptByAsymKey และ DecryptByAsymKey function เพื่อทำการ encrypt ข้อมูลแบบ asymmetric

และสามารถใช้ EncryptByKey และ DecryptByKey function เพื่อทำการ encrypt ข้อมูลแบบ symmetric

Asymmetric encryption ใช้ RSA algorithm โดยมี private keys แบบ 512, 1024 หรือ 2048 bytes

Symmetric encryption ใช้ TRIPLE_DES algorithm

Asymmetric keys มีความปลอดภัยสูงที่สุด แต่ก็ทำให้ performance ตกลงมากที่สุดเช่นกัน ต่างจาก Symmetric keys ที่ไม่มีปัญหาเรื่อง performance สามารถประมวลผลได้อย่างรวดเร็ว แต่ทั้งนี้ Symmetric keys มีความปลอดภัยน้อย ดังนั้น ควรเลือกใช้ประเภทของ keys ให้เหมาะสมกับความต้องการ และ ขนาดของ hardware infrastructure ด้วย

ตัวอย่างของข้อมูลที่ต้องการ encrypt
1. Password ของ users ที่ทำการจัดเก็บอยู่ในฐานข้อมูล
2. Sensitive data เช่น Credit card numbers, medical records

NooM