บันทึกการเปลี่ยนแปลงหลังจากแก้ไขตารางใน SQL Server Management Studio


265

ถ้าฉันต้องการบันทึกการเปลี่ยนแปลงใด ๆ ในตารางที่บันทึกไว้ก่อนหน้านี้ใน SQL Server Management Studio (ไม่มีข้อมูลในตารางปัจจุบัน) ฉันได้รับข้อความแสดงข้อผิดพลาด:

ไม่อนุญาตการเปลี่ยนแปลง การเปลี่ยนแปลงที่คุณทำต้องใช้ตารางต่อไปนี้เพื่อทำการดร็อปและสร้างใหม่ คุณได้ทำการเปลี่ยนแปลงในตารางที่ไม่สามารถสร้างขึ้นใหม่หรือเปิดใช้งานตัวเลือกป้องกันการบันทึกการเปลี่ยนแปลงที่ต้องมีการสร้างตารางขึ้นใหม่

สิ่งที่สามารถป้องกันตารางที่จะแก้ไขได้อย่างง่ายดาย? หรือเป็นวิธีปกติสำหรับ SQL Server Management Studio ที่ต้องการตารางการสร้างใหม่เพื่อแก้ไขหรือไม่ มันคืออะไร - "ตัวเลือกนี้ป้องกันการบันทึกการเปลี่ยนแปลง" ?



1
@Pang - คำถามนี้มาก่อนนี่ซ้ำกัน
GrandMasterFlush


@Pang - ฉันไม่รู้เหมือนกันขอบคุณ
GrandMasterFlush

คำตอบ:


573

ไปที่เครื่องมือ -> ตัวเลือก -> นักออกแบบ -> ยกเลิกการเลือก "ป้องกันการบันทึกการเปลี่ยนแปลงที่ต้องมีการสร้างตารางใหม่" voila

ที่เกิดขึ้นเพราะบางครั้งมีความจำเป็นต้องวางและสร้างตารางใหม่เพื่อเปลี่ยนบางสิ่งบางอย่าง ขั้นตอนนี้อาจใช้เวลาสักครู่เนื่องจากข้อมูลทั้งหมดจะต้องคัดลอกไปยังตารางชั่วคราวจากนั้นแทรกใหม่ในตารางใหม่ เนื่องจากค่าเริ่มต้นของ SQL Server ไม่เชื่อถือคุณคุณต้องพูดว่า "ตกลงฉันรู้ว่าฉันกำลังทำอะไรอยู่ตอนนี้ให้ฉันทำงานของฉัน"


8
ไซต์ Microsoft Support ไม่สนับสนุนสิ่งนี้ แต่ถ้าคุณไม่มีข้อมูลใด ๆ ในตารางฉันไม่เห็นอันตรายใด ๆ น่าจะดีที่สุดในการใช้ TSQL เพื่อทำการเปลี่ยนแปลง
Jon Smock

6
ฉันจะไม่แนะนำให้ใช้นักออกแบบสำหรับฐานข้อมูลที่สำคัญ ฉันเคยเห็นว่ามันผิดพลาดในหลาย ๆ ครั้ง นอกจากนี้ยังส่งเสริมนิสัยการพัฒนาที่ขี้เกียจและช่วยให้ผู้ใช้สามารถปรับเปลี่ยนโครงสร้างฐานข้อมูลที่อาจไม่สามารถทำได้หากพวกเขาไม่สามารถจัดการเส้นทางโค้ด SQL ได้
Mark W Dickson

5
ตกลงมาร์ค แต่ในการพัฒนาในช่วงต้นฉันไม่จำเป็นต้องเขียนกองสคริปต์
Kristopher

7
เป็นเรื่องที่น่าตกใจว่าเมื่อเดือนกันยายน 2559 และข้อผิดพลาดที่ไม่เป็นมิตรกับผู้ใช้ (ไม่มีตัวเลือกที่จะถามว่า "เฮ้คุณต้องการเปลี่ยนแปลงตารางหรือไม่") ยังคงเล่นอยู่ ไม่คุณเพิ่งได้รับปุ่มยกเลิกและต้องทำการเปลี่ยนแปลงทั้งหมดอีกครั้ง SQL Server ที่โง่ที่สุด
Mike Gledhill

2
@Mike Gledhill สวัสดีจากปี 2019 และนี่คือกรณี LOL
Captain Kenpachi

116

เครื่องมือ> ตัวเลือก

ป้อนคำอธิบายรูปภาพที่นี่

ยกเลิกการเลือกตัวเลือกด้านบน


5
ขอบคุณสำหรับภาพหน้าจอ ฉันกำลังมองหาบางอย่างเช่นนี้เพื่อช่วยให้ฉันพบตัวเลือกที่โง่ กล่องโต้ตอบควรมีช่องทำเครื่องหมาย "ทำต่อไป" เมื่อมีข้อความแจ้งว่าคุณไม่สามารถทำได้
Chris Benard

2
แนวทางปฏิบัติที่ดีที่สุดหลังจากที่คุณเปลี่ยนตัวเลือกนี้คือการตรวจสอบตัวเลือกด้านบน 'สร้างสคริปต์การเปลี่ยนแปลงอัตโนมัติ' เพื่อป้องกันข้อมูลสูญหาย
ไบ

ขอบคุณสำหรับภาพ มันมีประโยชน์มาก :)
M A.

72

เมื่อต้องการแก้ไขปัญหานี้ใช้คำสั่ง SQL เพื่อทำการเปลี่ยนแปลงโครงสร้างของข้อมูลเมตาของตาราง

ปัญหานี้เกิดขึ้นเมื่อเปิดใช้งานตัวเลือก"ป้องกันการบันทึกการเปลี่ยนแปลงที่ต้องมีการสร้างใหม่"

แหล่งที่มา: ข้อความแสดงข้อผิดพลาดเมื่อคุณพยายามบันทึกตารางใน SQL Server 2008: "ไม่อนุญาตให้บันทึกการเปลี่ยนแปลง"


12
คำถามของฉันคือ: ทำไม SQL Server ถึงไม่ใช้คำสั่ง T-SQL ที่จำเป็นแทนการดร็อปและสร้างตารางใหม่สำหรับการเปลี่ยนแปลงทุกครั้ง? ฉันไม่เข้าใจพฤติกรรมนี้
Jaime

15

แทนที่จะยกเลิกการทำเครื่องหมายที่กล่อง (โซลูชันที่ไม่ดี) คุณควรหยุดการแก้ไขข้อมูลด้วยวิธีดังกล่าว หากข้อมูลต้องมีการเปลี่ยนแปลงให้ทำด้วยสคริปต์เพื่อให้คุณสามารถย้ายข้อมูลไปยังการผลิตได้อย่างง่ายดายและเพื่อให้อยู่ภายใต้การควบคุมของแหล่งที่มา สิ่งนี้ยังทำให้การรีเฟรชการเปลี่ยนแปลงการทดสอบได้ง่ายขึ้นหลังจากการผลิตลดลงเป็น dev เพื่อให้นักพัฒนาสามารถทำงานกับข้อมูลที่สดใหม่


2
A) คุณสามารถคัดลอกสคริปต์ SSMS สร้างและใช้กับสภาพแวดล้อมการผลิตของคุณ B) SSMS มักจะง่ายกว่าเร็วกว่าและปลอดภัยกว่าเพราะ SSMS จัดการรายละเอียดทั้งหมดให้คุณ
เดินขบวน

2
Itg ยังคงเป็นความคิดที่ดีมาก คุณไม่ต้องการสร้างตารางบันทึก 10,000, 000 ใน prod มันไม่เร็ว ปลอดภัยกว่ากันไหม? ข้อมูลที่ไม่ถูกต้องคือข้อมูลที่ไม่ถูกต้องและการตรวจสอบความสอดคล้องจะทำงานหากคุณใช้สคริปต์ที่คุณเขียนเช่นเดียวกับถ้าคุณปล่อยให้ SSMS เขียนหนึ่งรายการ มันคือการปฏิบัติที่ไม่ดีใน 100% ของกรณี
HLGEM

15

ไปที่ SSMS แล้วลองทำสิ่งนี้

เมนู >> เครื่องมือ >> ตัวเลือก >> นักออกแบบ >> ยกเลิกการเลือก“ ป้องกันการบันทึกการเปลี่ยนแปลงที่ต้องมีการสร้างตารางใหม่”

นี่คือคำอธิบายที่ดีมากเกี่ยวกับเรื่องนี้: http://blog.sqlauthority.com/2009/05/18/sql-server-fix-management-studio-error-saving-changes-in-not-permission-the-changes ได้คุณ-ได้ทำ-ต้อง-the-ต่อไปนี้ตาราง-เพื่อจะลดลงและสร้างขึ้นใหม่ที่คุณมี-ทั้งทำเปลี่ยนแปลงไป-a-แท็บ /


14

การเปลี่ยนแปลงมากมายที่คุณสามารถทำได้ง่ายและชัดเจนในตัวแก้ไขตารางใน SQL Server Management Studio ต้องการ SSMS เพื่อวางตารางในพื้นหลังและสร้างใหม่อีกครั้งตั้งแต่เริ่มต้น แม้แต่สิ่งง่าย ๆ เช่นการจัดเรียงคอลัมน์ใหม่ไม่สามารถแสดงในคำสั่ง SQL DDL มาตรฐาน - SSMS ทั้งหมดสามารถทำได้คือวางและสร้างตารางใหม่

การดำเนินการนี้อาจเป็น) ใช้เวลานานมากบนโต๊ะขนาดใหญ่หรือ b) อาจล้มเหลวด้วยเหตุผลหลายประการ (เช่นข้อ จำกัด และสิ่งต่าง ๆ ของ FK) ดังนั้น SSMS ใน SQL Server 2008 แนะนำตัวเลือกใหม่ที่คำตอบอื่น ๆ ได้ระบุไว้แล้ว

ในตอนแรกมันอาจดูเหมือนเคาน์เตอร์ง่ายเพื่อป้องกันการเปลี่ยนแปลงดังกล่าว - และมันก็สร้างความรำคาญให้กับเซิร์ฟเวอร์ dev แต่บนเซิร์ฟเวอร์ที่ใช้งานจริงตัวเลือกนี้และค่าเริ่มต้นของการป้องกันการเปลี่ยนแปลงดังกล่าวจะกลายเป็นเครื่องมือช่วยชีวิต!


2
ตอนนี้ฉันอยู่บนเซิร์ฟเวอร์การพัฒนา แต่อย่างใดอย่างหนึ่งที่ใช้งานจริงฉันจะเปิดใช้งานอย่างแน่นอน ขอขอบคุณอีกครั้งสำหรับการแบ่งปันประสบการณ์
REM

1
แต่ตัวอย่างเช่นการเปลี่ยนขนาดของคอลัมน์ nvarchar จาก 100 เป็น 120 เป็นการดำเนินการที่ตรงไปตรงมามากซึ่งสามารถทำได้อย่างง่ายดายด้วย ALTER TABLE ... แล้วทำไม SQL Server (Management Studio) จึงปล่อยและสร้างตารางใหม่อีกครั้ง กรณี?
Jaime

4
@ Jaime: คุณต้องถามนักพัฒนาของนักออกแบบภาพนั้น - ไม่มีใครรู้ มันเป็นความจริง - ด้วยนักออกแบบภาพการเปลี่ยนแปลงที่ตรงไปตรงมาจำนวนมากจะทำโดยการสร้างตารางขึ้นใหม่และคัดลอกไปมา หากคุณต้องการใช้วิธีการที่ตรงไปตรงมามันก็ขึ้นอยู่กับคุณที่จะจัดการด้วยตัวคุณเองโดยการเขียนคำสั่ง T-SQL ที่ง่ายและดำเนินการ
marc_s

1
ขอขอบคุณคุณ @marc_s ตรงนี้เป็นคำตอบที่ผมคาดหวังว่า แต่ผมมีความเชื่อน้อยในพวกเขามีเหตุผลที่ซ่อนที่จะอธิบายมันทั้งหมด :)
ไจ

1
ข้อ จำกัด นี้ยังป้องกัน ID วัตถุจากการเปลี่ยนแปลงโดยที่คุณไม่ทราบ (ในกรณีที่คุณต้องการที่จะไม่เกิดขึ้น)
เดินขบวน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.