ปัญหาเช่นนี้แสดงให้เราเห็นว่าผู้ที่สร้างเซิร์ฟเวอร์ SQL ไม่เคยใช้ผลิตภัณฑ์ของตน นี่เป็นการละเว้นการจ้องมองที่ใคร ๆ ก็ต้องสงสัยว่าพวกเขาลืมทำอะไรอย่างถูกต้อง (ฉันได้รับรายการของปัญหาน่าคลั่งอื่น ๆ อีกประมาณ 30 เรื่องเช่นนี้ที่ฉันต้องเอาชนะเพื่อให้งานนี้เป็นฐานข้อมูลอื่น ๆ รวมถึงความจริงที่ว่าเราต้องการตัวช่วยสร้างหมัดเพื่อทำสิ่งนี้ในตอนแรก [ถ้าฉันมีเวลาฉันใช้เวลารอตัวช่วยสร้างนี้เพื่อเชื่อมต่อและระบุตารางเดียวกันสำหรับฐานข้อมูลเดียวกันทุกครั้งกลับ ... ฉันมีเวลาสำหรับวันหยุดพักผ่อนที่ดี])
ฉันขี้เกียจมากและไม่ต้องการพิมพ์ EXEC sp_msforeachtable ...
ทุกครั้งที่ฉันทำสิ่งนี้ งานของฉันคือการทิ้งข้อ จำกัด ไว้ในเซิร์ฟเวอร์ที่ใช้งานจริงและลบออกจากเซิร์ฟเวอร์ dev สิ่งนี้จะป้องกันข้อผิดพลาด แต่วิธีนี้มีผลข้างเคียงน้อยมาก ก่อนอื่นคุณจะไม่สามารถกู้คืนการสำรองข้อมูลเต็มรูปแบบไปยังเซิร์ฟเวอร์ dev ของคุณได้อีกต่อไป (เว้นแต่คุณจะตกลงด้วยการลบข้อมูลทั้งหมดอีกครั้ง) ประการที่สองวิธีนี้ทำงานได้ดีที่สุดเมื่อคุณมั่นใจว่าผู้บริโภคข้อมูลของคุณบังคับใช้ข้อ จำกัด เหล่านี้ (หรือไม่สนใจพวกเขา) ในกรณีของฉันเรามีผู้บริโภคเพียงคนเดียว (เว็บไซต์ของเรา) ดังนั้นเราจึงได้สร้างข้อ จำกัด เหล่านี้ลงในรหัสไซต์ด้วย (เช่นก่อนที่เราจะลบบันทึกผู้ใช้เราจะลบบันทึกโทรศัพท์ทั้งหมดสำหรับผู้ใช้รายนั้นก่อน) ใช่, สิ่งนี้ทำให้ความต้องการในการ จำกัด ในสถานที่แรกขัดแย้งกับงานที่ฉันต้องทำเพิ่มขึ้นเป็นสองเท่า แต่มันก็ทำให้ฉันมีโอกาสที่จะตรวจสอบว่ารหัสของฉันทำงานได้โดยมีหรือไม่มีข้อ จำกัด ตาม DBMS (ความจริงก็คือ เซิร์ฟเวอร์เป็นแผนฉุกเฉินเท่านั้น) คุณสามารถเรียกสิ่งนี้ว่าข้อบกพร่องในการออกแบบของฉัน แต่ฉันอยากจะเรียกมันว่าวิธีแก้ปัญหาสำหรับ DBMS ที่มีข้อบกพร่อง อย่างไรก็ตามมันก็เร็วและง่ายกว่าที่จะทำที่อื่นนอกเหนือจากจาก MSSQL เพราะไม่สามารถรับมือกับการออกแบบของตัวเองได้
sp_msforeachtable
(และsp_MSForEachDb
) ไม่มีเอกสารและไม่สนับสนุน คุณไม่ควร / หลีกเลี่ยงการใช้มัน มันอาจข้ามตาราง !! ดูโพสต์นี้จาก @AaronBertrand -> sqlblog.com/blogs/aaron_bertrand/archive/2010/12/29/…และรายการเชื่อมต่อนี้ - (MS ระบุว่าพวกเขาจะไม่แก้ไข) -> connect.microsoft.com/SQLServer / feedback / details / 264677 / …