[DB2] db2 load error SQL3550W The target column has been defined as GENERATED ALWAYS

อันนี้มาช่วยน้องแก้ปัญหา หลังจากแนะนำให้ใช้ Operation db2 load เพื่อเอาข้อมูลจากที่ UAT มาขึ้นใหม่อีกเครื่องครับ หลังจากน้องตรวจสอบ Log พบ Error ว่าไม่สามารถเอาข้อมูลได้

จาก Error ที่พบทั้ง 66187 Record ถูก Rejected หมดเลยครับ ต้องไปส่องหาสาเหตุจากไฟล์ tab839.msg

พอมาดูที่ message file แล้วถึงบางอ้อเลยครับ

SQL3550W The field value in row "F0-3" and column "3" is not NULL, but the
target column has been defined as GENERATED ALWAYS.
  • SQL3550W : อันนี้ต้องสนใจครับ เพราะตัว Error เต็มมี Keyword ที่สำคัญ
    • column "3" is not NULL, : Field ที่มีปัญหาเป็น Column ที่ 3 ครับ
    • but the target column has been defined as GENERATED ALWAYS. เมื่อลองไปดูที่ Schema พบว่า Table ที่สนใจ Field ที่มีปัญหาที่เป็น Identify
    • และพอลอง Track กลับไปดูที่ Schema พบว่า Field ที่ 3 คือ Field SEQUENCEID ที่เป็น Auto Generate Number (Identify) เมื่อพยายาม Load เข้าไปใหม่ มันเลยไม่ยอมครับ เพราะ Load คือ การเอาค่าทับ แต่ไปเจอว่า Column บังคับว่าต้อง Generate ใหม่ มันเลยไม่ยอม
SQL3185W The previous error occurred while processing data from row "F0-3" of
the input file.
  • SQL3185W : อันนี้ไม่ต้องสนใจครับ เป็น Error ต้องเนื่องมาจาก SQL3550W

สาเหตุ

  • ขอสรุปสาเหตุอีกรอบครับ มันเกิดจากการใช้ db2 load กับ Table ทีมีบาง Field ถูกกำหนดเป็น Identify หาก Schema มี DDL แบบนี้ "GENERATED ALWAYS AS IDENTITY" ใช่เลยครับ
CREATE TABLE "DS"."PRINTDEALSLIP"  (
		  "KEYNAME" CHAR(18) , 
		  "SEQUENCEID" INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (  
		    START WITH +1  
		    INCREMENT BY +1  
		    MINVALUE +1  
		    MAXVALUE +2147483647  
		    NO CYCLE  
		    CACHE 20  
		    NO ORDER ) , 
		  "SEQUENCEDATE" DATE NOT NULL , 
		  "DEALSLIPNO" VARCHAR(13) , 
		  "PRINTEDDATE" TIMESTAMP , 
		  "PRINTEDBY" INTEGER , 
		  "ACTIVEFLAG" CHAR(1) WITH DEFAULT 'A' )   
		 IN "USERSPACE1"  
		 ORGANIZE BY ROW  ;

การแก้ไข

  • เพิ่ม Option ที่ใช้ของ db2 load เพิ่ม Option "MODIFIED BY IDENTITYOVERRIDE"
  • เดิม
db2 load from <file.ixf> of ixf  replace into <tablename>
  • ใหม่
db2 load from <<IXF>> of ixf  MODIFIED BY IDENTITYOVERRIDE replace into <<TABLE>>

Note

สำหรับ Option เรื่อง identity db2 มี 3 แบบครับ

  • modified by identityignore : ให้ระบบ generate ค่าใหม่เลย แต่ข้อมูลใน Field ที่เป็น Auto Generate ห้ามขาดไปนะ
  • modified by identitymissing : คล้ายกับ identityignore แต่ db2 มันจะมองว่าไฟล์ที่ load ต้นทาง ไม่มีข้อมูลของ Field ที่เป็น Auto Generate มาให้
  • modified by identityoverride : เชื่อจากข้อมูลที่ load หมดเลยครับ ใช้ในกรณีที่ migrate

Reference


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts to your email.