Monday, February 8, 2010

Oracle Heterogeneous Service (HS) การเชื่อมต่อ Oracle กับฐานข้อมูลตัวอื่น ๆ เช่น Microsoft SQL Server หรือ AS400 (ตอนที่ 2)

ข้อเขียนนี้ช่วยฉัน: 
เมื่อครั้งที่แล้วเราได้อ่านเรื่องของ ณัฐพล และอธิชาติซึ่งใช้วิธีการที่แตกต่างกันในการแก้ปัญหาเรื่องการเชื่อมต่อระบบฐานข้อมูลต่างยี่ห้อกันโดย ณัฐพลใช้วิธีการ Export Import ข้อมูลเข้าออกจากฐานหนึ่งไปยังอีกฐานหนึ่งทุกวัน ส่วนอธิชาตินั้นใช้วิธีการที่เราเรียกว่า Heterogeneous Service ซึ่งจะทำให้ระบบฐานข้อมูลต่างยี่ห้อสามารถคุยกันได้โดยตรง ครั้งนี้เราจะมาลองดูวิธีปฏิบัติกันนะครับ
สำหรับขั้นตอนนั้นเราสามารถแบ่งได้เป็นหัวข้อ ๆ ดังนี้ครับ
1. ลงโปรแกรมที่จำเป็นของระบบฐานข้อมูลที่เราต้องการเชื่อมต่อด้วย เช่นหากเราต้องการจะเชื่อมต่อกับ AS400 เราจะต้องลงโปรแกรม IBM AS400 Client Access Express เพื่อที่จะได้ Driver ของ AS400 มาสร้าง ODBC ลองปรึกษา System Admin ที่ดูแล AS400 อยู่นะครับเขาน่าจะช่วยคุณได้ อันนี้ไม่ยาก
2. คราวนี้เราก็สร้าง Datasource ใน ODBC ชื่อ "AS400" ดังตัวอย่างข้างล่างนี้ครับ








3. สร้างไฟล์ชื่อ ORACLE_HOME\hs\admin\initAS400.ora เพื่อให้ Oracle รู้จัก ODBC Datasource ที่เราสร้างขึ้น ORACLE_HOME คือ Oracle Home ที่เราลง Oracle ไว้ซึ่งจะต่างกันไปตามเวอร์ชั่นที่เราลง Oracle ไว้ ตัวอย่างเช่น บนเครื่องวินโดวส์ XP ของผม ORACLE_HOME จะเป็น C:\oracle\product\10.2.0\db_1 ผมก็จะสร้างไฟล์ไว้ที่ C:\oracle\product\10.2.0\db_1\hs\admin\initAS400.ora เป็นต้น (ชื่อไฟล์จะพิมพ์ตัวใหญ่หรือเล็กก็ได้) ในไฟล์นี้ให้เราพิมพ์ข้อความลงไปดังนี้

HS_FDS_CONNECT_INFO = AS400 #ODBC DSN
HS_FDS_TRACE_LEVEL = OFF

โดยตรง "AS400" จะต้องเหมือนกับชื่อที่เราตั้งไว้ตอนสร้าง ODBC Datasource

4. จากนั้นเราจะต้องอัพเดท Listener โดยเพิ่มส่วนของ AS400 เข้าไป เพื่อให้ Oracle รู้จักเสมือนว่า AS400 เป็น Instance หนึ่งที่รันอยู่บนเครื่องของมัน โดยเราจะเข้าไปเพิ่มเติมข้อความในไฟล์ LISTENER.ORA ซึ่งบนเครื่องของผมจะอยู่ที่ ORACLE_HOME\network\admin\LISTENER.ORA (แทนที่ ORACLE_HOME ด้วย C:\oracle\product\10.2.0\db_1)

(SID_DESC=
(SID_NAME=AS400)
(ORACLE_HOME=C:\oracle\product\10.2.0\db_1)
(PROGRAM=hsodbc)
)

ให้ใส่ตรงส่วน SID_LIST ดังตัวอย่างข้างล่าง (สีแดงคือส่วนที่เพิ่มเข้าไป)

SID_LIST_LISTENER =
  (SID_LIST =
      (SID_DESC =
         (SID_NAME = PLSExtProc)
         (ORACLE_HOME = C:\oracle\product\10.2.0\db_1)
         (PROGRAM = extproc)
      )
      (SID_DESC =
         (SID_NAME =AS400)
         (ORACLE_HOME = C:\oracle\product\10.2.0\db_1)
         (PROGRAM = hsodbc)
      )
  )

ตรง PROGRAM=hsodbc ให้พิมพ์ตรงตัวเลย ส่วนตรง ORACLE_HOME=ORACLE_HOME=C:\oracle\product\10.2.0\db_1 ถ้า Oracle Home ของคุณแตกต่างไปจากนี้ ก็ให้แก้ตาม Oracle Home ที่แท้จริงของคุณ หลังจาก Save ไฟล์แล้วเราจะต้อง Refresh Listener (Listener เป็นโปรแกรมเล็ก ๆ ที่ทำหน้าที่รอคอยการเชื่อมต่อจากเครื่อง Client) การ Refresh สามารถทำได้โดยการพิมพ์ที่ OS Prompt ดังนี้ (บนเครื่องผมจะเป็น DOS Prompt)

C:\>lsnrctl reload

5. จากนั้นเราก็ต้องอัพเดทไฟล์ TNSNAMES.ORA ไฟล์นี้เป็นไฟล์ที่เครื่อง Oracle Client ใช้ในการ Connect กับฐาน
ข้อมูล ในไฟล์จะประกอบด้วยข้อมูลว่าจะให้ Connect ไปที่เครื่องไหน ชื่อ Database คืออะไรเป็นต้น ไฟล์นี้จะอยู่ที่ ORACLE_HOME\network\admin\TNSNAMES.ORA

AS400 =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))
(CONNECT_DATA=(SID=AS400))
(HS=OK)
)

ตรง HOST= จะเป็น "localhost" เสมอเนื่องจากเราต้องการให้ Connect เข้าหา AS400 ODBC ที่เราสร้างไว้บนตัวมัน ส่วน SID ก็คือชื่อของ Listener ที่เราได้สร้างไว้ในขั้นตอนก่อนหน้า ในไฟล์ TNSNAMES.ORA อาจจะมีข้อมูลของการ Connect ฐานข้อมูลอื่นอยู่ก่อนแล้ว ให้เราหาที่ ๆ จะเพิ่มข้อความใหม่ที่เหมาะสม โดยดูจากฟอร์แมตของเดิมเป็นหลัก

6. จากนั้นเราก็พร้อมที่จะติดต่อกับ AS400 แล้ว โดยการจะติดต่อเราจะต้องติดต่อผ่าน Database Link เท่านั้น เราไม่สามารถจะ Connect โดยตรง เช่นเราไม่สามารถจะ Connect โดยใช้วิธี SQL> connect qpcs@as400 ได้
การสร้าง Database Link ทำได้โดยการ Connect เข้าฐานข้อมูล Oracle โดยใช้ User ที่ต้องการให้ติดต่อกับฐานข้อมูล AS400 เช่น User ที่ต้องการเก็บข้อมูลพักของ AS400 หรือ User ที่ต้องการ Join ตารางใน Schema ของตนกับ AS400 โดย User นั้นจะต้องมีสิทธิ์ในการสร้าง Database Link ถ้าไม่มีก็ให้ DBA Grant ให้โดยใช้คำสั่ง

SQL> grant create database link to scott;

จากตัวอย่างเรา grant สิทธิ์ในการสร้าง Database Link ให้กับ Scott เราจะ Connect โดยใช้ User Scott แล้วสร้าง Database Link ก่อนอื่นเราจะต้องทราบ Username และ Password ที่จะใช้ในการ Connect เข้า AS400 ก่อน สมมติว่าเราจะ Connect เข้าสู่ AS400 ด้วย User QPCS (เป็น User จริง ๆ ที่มีอยู่บน AS400 และมีสิทธิ์ในตารางที่เราต้องการข้อมูล) โดยมี Password เป็น PassW01 เราก็สามารถจะสร้าง Database Link ได้ดังนี้

SQL> create database link as400 connect to qpcs identified by passw01 using 'AS400';

เพียงเท่านี้เราก็สามารถที่จะ Connect เข้ากับฐานข้อมูล AS400 โดยตรงโดยผ่าน User Scott บน Oracle

SQL> conn scott
Enter password:
Connected.
SQL> create database link as400 connect to qpcs identified by passw01 using 'AS400';

Database link created.

SQL> select * from ACCLIB.TBACCOUNT@as400;

คิวรีข้างบนนี้จะแสดงผลข้อมูลจากตาราง TBACCOUNT ใน Library ACCLIB ได้โดยตรงแบบ Real Time ถ้าเราต้อง
การสร้าง Copy ของตารางเก็บไว้ก็เพียงใช้คำสั่ง create as select เช่น

SQL> create table acclib_tbaccount nologging as select * from acclib.tbaccount@as400;

ถ้าเราไม่ซีเรียสเรื่องดึงข้อมูลจาก AS400 แบบ Real Time การสร้าง Copy ไว้บน Oracle จะทำให้การทำงานราบรื่นขึ้น เนื่องจากระหว่างวันที่มีการใช้งานระบบ AS400 อาจจะมีการ Lock ตาราง เป็นระยะ ๆ ซึ่งอาจจะทำให้เราไม่สามารถที่จะ Select ข้อมูลได้

บทความที่เกี่ยวเนื่องกัน
Oracle Heterogeneous Service (HS) การเชื่อมต่อ Oracle กับฐานข้อมูลตัวอื่น ๆ เช่น Microsoft SQL Server หรือ AS400 (ตอนที่ 1)

2 comments:

Raspit said...

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

Rocker said...

ในทางกลับกัน ต้องการบันทึกลงข้อมูล AS/400 จากฐานข้อมูลออราเคิล จะต้องทำอะย่างไรครับ เพราะฟ้อง

ORA-28500: connection from ORACLE to a non-Oracle system returned this message:
[Generic Connectivity Using ODBC][IBM][iSeries Access ODBC Driver][DB2 UDB]SQL7008 - ECMPNM in TPIENG not valid for operation. (SQL State: S1000; SQL Code: -7008)
ORA-02063: preceding 2 lines from TPIENG

Post a Comment