ข้อความแสดงข้อผิดพลาดเมื่อคุณซิงโครไนซ์ Microsoft Dynamics AX กับตารางใน Microsoft SQL Server: "ไม่สามารถดำเนินการคำสั่งภาษาของข้อกำหนดข้อมูลบน [table_name]"

นำไปใช้กับ: Microsoft Dynamics AX 4.0Axapta Object Server

อาการ


เมื่อคุณซิงโครไนซ์ Microsoft Dynamics AX กับตารางใน Microsoft SQL Server คุณจะได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้:
ไม่สามารถเรียกใช้คำสั่งภาษาของข้อกำหนดข้อมูลบนtable_name ฐานข้อมูล SQL ได้ออกข้อผิดพลาด
นอกจากนี้ข้อความแสดงข้อผิดพลาดที่คล้ายกับต่อไปนี้ถูกบันทึกไว้ในบันทึกของแอปพลิเคชันตัวแสดงเหตุการณ์บนเซิร์ฟเวอร์แอปพลิเคชันออบเจ็กต์ (AOS):
Object Server 01: ฐานข้อมูลที่รายงาน (เซสชันที่ 1 (ผู้ดูแลระบบ)): [Microsoft] [โปรแกรมควบคุม ODBC SQL Server] [SQL Server] สร้างดัชนีที่ไม่ซ้ำกันหยุดทำงานเนื่องจากพบคีย์ที่ซ้ำกันสำหรับชื่อวัตถุ ' dbotable_name' และชื่อดัชนี 'I_xxxIDX' ค่าคีย์ที่ซ้ำกันคือ (value1, value2) คำสั่ง SQL คือ: "สร้างดัชนีที่ไม่ซ้ำกัน I_xxxIDX บน table_name (คอลัมน์1คอลัมน์,ต่อๆไป)"
หมายเหตุ
  • ตัวยึด table_name เป็นตัวยึดสำหรับชื่อตาราง
  • ตัวแทน I_xxxIDX เป็นตัวยึดสำหรับชื่อดัชนีที่ไม่ซ้ำกัน
  • พื้นที่ที่สำรองไว้ของ value1 และตัวยึด value2 เป็นพื้นที่ที่สำรองไว้สำหรับค่าคีย์ที่ซ้ำกัน
  • พื้นที่ที่สำรองไว้ของ คอลัมน์1คอลัมน์ และตัวยึด ต่อๆไป คือตัวยึดที่แสดงชื่อคอลัมน์

สาเหตุ


ปัญหานี้เกิดขึ้นเนื่องจากฐานข้อมูล SQL Server มีระเบียนที่ซ้ำกันโดยยึดตามดัชนีที่ไม่ซ้ำกันที่ Microsoft Dynamics AX พยายามสร้างหรือพยายามสร้างใหม่

การแก้ไข


ข้อควรระวัง ก่อนที่คุณจะเอาข้อมูลออกจากฐานข้อมูล Microsoft Dynamics AX คุณควรทำความเข้าใจเกี่ยวกับสาเหตุที่มีการเพิ่มดัชนีที่ไม่ซ้ำกันใหม่ โดยทั่วไปแล้ว Microsoft Dynamics AX จะเพิ่มหรือเอาดัชนีออกเมื่อมีการเปลี่ยนแปลงคีย์สิทธิ์การใช้งานหรือเมื่อคุณเพิ่มหรือเอาโมดูลในฟอร์มการกำหนดค่า Microsoft Dynamics AX ออก นอกจากนี้ดัชนีอาจถูกเพิ่มเมื่อนักพัฒนาเพิ่มดัชนีผ่านทางแอปพลิเคชันออบเจ็กต์ (AOT) หรือผ่านขั้นตอนการอัปเกรดปกติ ถ้าคุณไม่แน่ใจว่าเหตุใดดัชนีจึงถูกเพิ่มคุณไม่ควรเอาข้อมูลออก หมายเหตุ: ก่อนที่คุณจะทำตามคำแนะนำในบทความนี้ตรวจสอบให้แน่ใจว่าคุณมีสำเนาสำรองของฐานข้อมูลที่สมบูรณ์ที่คุณสามารถคืนค่าได้ถ้ามีปัญหาเกิดขึ้นเมื่อต้องการแก้ไขปัญหานี้ให้เอาระเบียนที่ซ้ำกันออกจากตารางเพื่ออนุญาตให้มีการเพิ่มดัชนีที่ไม่ซ้ำกันหรือตรวจสอบว่าควรเพิ่มดัชนีที่ไม่ซ้ำกันหรือไม่ โดยทำตามขั้นตอนต่อไปนี้:
  1. บนเซิร์ฟเวอร์ AOS ให้คลิกเริ่มคลิกเรียกใช้พิมพ์eventvwr จากแล้วคลิกตกลง
  2. ในแผนภูมิคอนโซลตัวแสดงเหตุการณ์ให้คลิกโหนดแอปพลิเคชัน
  3. ดูข้อผิดพลาดของคีย์ที่ซ้ำกันที่ปรากฏขึ้นก่อนในบันทึกของแอปพลิเคชัน เมื่อต้องการทำเช่นนี้ให้ดับเบิลคลิกที่ข้อผิดพลาดและแหล่งที่มา: รายการ Dynamics Server 0xที่ปรากฏเป็นอันดับแรกในบานหน้าต่างรายละเอียดหมายเหตุ Xคือพื้นที่ที่สำรองไว้สำหรับอินสแตนซ์ของบริการ AOS ที่ส่งกลับข้อความแสดงข้อผิดพลาด
  4. ขึ้นอยู่กับข้อความแสดงข้อผิดพลาดที่ปรากฏขึ้นให้แทนที่ชื่อตารางชื่อคอลัมน์และชื่อดัชนีที่มีค่าในข้อความแสดงข้อผิดพลาดในสคริปต์ SQL Server ที่คุณใช้ในขั้นตอนถัดไป
  5. หลังจากที่ค่าจะถูกแทนที่จากข้อผิดพลาดจริงให้เรียกใช้สคริปต์ SQL Server ต่อไปนี้ในตัววิเคราะห์คำถาม SQL หรือใน SQL Server Management Studio
    select count(*) as Duplicate_Record_Count, <column1>, <column2> from <table_name> group by <column1>, <column2> having count(*) > 1 
    หมายเหตุ แทนที่พื้นที่ที่สำรองไว้ด้วยข้อมูลที่เหมาะสมเมื่อคุณเรียกใช้สคริปต์
  6. สำหรับระเบียนแต่ละระเบียนที่ส่งกลับในขั้นตอนที่5มีระเบียนที่ซ้ำกันอย่างน้อยหนึ่งระเบียนที่มีอยู่ คอลัมน์ Duplicate_record_count จะระบุจำนวนระเบียนที่ซ้ำกันโดยใช้ค่าดัชนีเหล่านั้น ถ้าพบระเบียนที่ซ้ำกันคุณจะต้องกำหนดว่าระเบียนจะถูกเอาออกเพื่อเพิ่มดัชนีที่ไม่ซ้ำกันหรือไม่ว่าควรจะเพิ่มดัชนีที่ไม่ซ้ำกันหรือไม่ เมื่อต้องการค้นหาระเบียนที่ซ้ำกันทั้งหมดให้เรียกใช้สคริปต์ต่อไปนี้
    select Distinct a.* from <table_name> a join (select <column1>, <column2> from <table_name> group by <column1>, <column2> having count(*) > 1) bon a.<column1> = b.<column1> and a.<column2> = b.<column2>  
    หมายเหตุ
    • แทนที่พื้นที่ที่สำรองไว้ด้วยข้อมูลที่เหมาะสมก่อนที่คุณจะเรียกใช้สคริปต์ คุณสามารถขอรับข้อมูลจากข้อความแสดงข้อผิดพลาดได้
    • คอลัมน์ Recid สามารถใช้เป็นตัวระบุคีย์ในแต่ละตารางเพื่อเลือกหรือเอาระเบียนออกได้
    • ถ้าคุณไม่แน่ใจเกี่ยวกับวิธีการเรียกใช้สคริปต์หรือแปลผลลัพธ์คุณสามารถทำงานร่วมกับผู้ดูแลระบบฐานข้อมูลที่ผ่านการรับรองความถูกต้อง (DBA) และช่างเทคนิคการสนับสนุนเพื่อตัดสินใจว่าจะประมวลผลอย่างไร
  7. ทำซ้ำขั้นตอนที่5และขั้นตอนที่6จนกว่าสคริปต์ในขั้นตอนที่5จะส่งกลับค่า null ที่ระบุว่าไม่มีค่าที่ซ้ำกันเพิ่มเติมและไม่สามารถเพิ่มดัชนีที่ไม่ซ้ำได้
  8. ถ้ามีดัชนีที่ไม่ซ้ำกันมากกว่าหนึ่งรายการให้ดูที่ข้อผิดพลาดคีย์ซ้ำถัดไปในบันทึกของแอปพลิเคชันตัวแสดงเหตุการณ์แล้วทำซ้ำขั้นตอนที่4ถึงขั้นตอนที่7จนกว่าจะไม่มีข้อผิดพลาดของคีย์ที่ซ้ำกันเพิ่มเติมในบันทึกของแอปพลิเคชันตัวแสดงเหตุการณ์