Friday, April 24, 2009

Got error "38H01;DB2MQ.MQSEND|MQSND1CLOB|rc=1:amSesCreateSe" when DB2 trigger send message to MQ

หลังจากทดลองใช้ข้อมูลไปยัง MQ ผ่านทาง DB2MQ.MQSEND and etc. ไปแล้ว
ผมก็ได้ทดลองนำไป implement เข้ากับ trigger แต่ผลที่ได้ ตกใจเลยครับ ซวยละมัน error


DB2 SQL error: SQLCODE: -723, SQLSTATE: 09000, SQLERRMC: COMMON.TGT_EPAPP;-

443;38H01;DB2MQ.MQSEND|MQSND1CLOB|rc=1:amSesCreateSe
 Message: An error occurred in a triggered SQL statement in trigger "COMMON.TGT_EPAPP".  

Information returned for the error includes SQLCODE "-443", SQLSTATE "38H01" and message 

tokens "DB2MQ.MQSEND|MQSND1CLOB|rc=1:amSesCreateSe". 

เกิดอะไรขึ้นเนี๊ยะ error  SQL-443 เนี๊ยะก็มีหลาย reason ด้วย งงเลยครับ
แล้ว SQLSTATE 38H01 เนี๊ยะไม่เคยเห็นมาก่อนเลย หาไปหามาก็ได้คำตอบว่า

38H01 An MQSeries® function failed to initialize.

ครับโดยอ้างอิงจาก  นี้

อ้าวแล้วทำไมอยู่ดีๆมันถึง initial ไม่ได้ละงงล่ะสิครับ ทดลองสร้าง table ขึ้นมาเอง แล้วรัน
ก็ทำได้แฮะ  งั้นเราลองรัน command ผ่าน font end เพื่อให้ trigger ทำงานดีกว่า
อาวว ก็ทำงานได้นี่ แล้วทำไม พอรันผ่าน WebSphere Application Server ไม่ได้เนี๊ยะ

คิดไปคิดมา มีสิ่งเดียวที่แตกต่าง นั้นก็คือ USER ที่เข้าใช้งาน DB2 นั้นเอง
ผมเลยทดลองใช้ font-end login เข้าด้วย user เดียวกับที่ set ไว้ใน connection pool
ผลก็คือได้ error

SQLCODE "-443", SQLSTATE "38H01" and message tokens 

"DB2MQ.MQSEND|MQSND1CLOB|rc=1:amSesCreateSe

เหมือนกันเลยครับ แบบนี้ต้องเกี่ยวกับ permission แน่เลย
เมื่อทดลองใช้ command grant สิทธิสำหรับ select ให้กับ user ใน connection pool
ดังนี้

CONNECT TO CHANDB;
GRANT  SELECT ON TABLE DB2MQ.MQHOST TO USER POOLUSER;
GRANT  SELECT ON TABLE DB2MQ.MQPOLICY TO USER POOLUSER;
GRANT  SELECT ON TABLE DB2MQ.MQPUBSUB TO USER POOLUSER;
GRANT  SELECT ON TABLE DB2MQ.MQSERVICE TO USER POOLUSER;
GRANT  SELECT ON TABLE DB2MQ.MQUPDATED TO USER POOLUSER;
CONNECT RESET;

แล้วทดลองอีกครั้ง โอ้ววว ทำงานได้ปกติแล้ว

เรื่องนี้สอนให้รู้ว่า error code ไม่ได้ช่วยอะไรเราเลย 




No comments: