Lưu các thay đổi sau khi chỉnh sửa bảng trong SQL Server Management Studio


265

Nếu tôi muốn lưu bất kỳ thay đổi nào trong bảng, trước đây đã lưu trong SQL Server Management Studio (không có dữ liệu trong bảng), tôi nhận được thông báo lỗi:

Lưu thay đổi không được phép. Những thay đổi bạn đã thực hiện yêu cầu bỏ các bảng sau đây và tạo lại. Bạn đã thực hiện các thay đổi đối với bảng không thể được tạo lại hoặc bật tùy chọn Ngăn chặn lưu các thay đổi yêu cầu bảng được tạo lại.

Điều gì có thể ngăn bảng dễ dàng được chỉnh sửa? Hoặc, đó có phải là cách thông thường để SQL Server Management Studio yêu cầu tạo lại bảng để chỉnh sửa? Nó là gì - "tùy chọn Ngăn chặn thay đổi" này ?


4
không thể sao chép các thay đổi Lưu trong SQL Server
Pang

1
@Pang - Câu hỏi này xuất hiện đầu tiên, đây là bản sao.
GrandMasterFlush


@Pang - Tôi không biết điều đó, cảm ơn.
GrandMasterFlush

Câu trả lời:


573

Đi vào Công cụ -> Tùy chọn -> Nhà thiết kế-> Bỏ chọn "Ngăn chặn lưu thay đổi yêu cầu tạo lại bảng". Voila.

Điều đó xảy ra bởi vì đôi khi cần phải bỏ và tạo lại một bảng để thay đổi một cái gì đó. Điều này có thể mất một lúc, vì tất cả dữ liệu phải được sao chép vào bảng tạm thời và sau đó được chèn lại vào bảng mới. Vì SQL Server theo mặc định không tin tưởng bạn, bạn cần nói "OK, tôi biết tôi đang làm gì, bây giờ hãy để tôi làm việc của mình."


8
Trang web Hỗ trợ của Microsoft không khuyến khích điều này, nhưng nếu bạn không có bất kỳ dữ liệu nào trong bảng, tôi sẽ không thấy tác hại. Có lẽ tốt nhất để sử dụng TSQL để thực hiện các thay đổi.
Jon Smock

6
Cá nhân tôi sẽ không khuyến khích sử dụng trình thiết kế cho các cơ sở dữ liệu quan trọng. Tôi đã thấy nó mắc sai lầm tốn kém trong nhiều dịp. Ngoài ra, nó khuyến khích thói quen phát triển lười biếng và cho phép mọi người sửa đổi cấu trúc cơ sở dữ liệu, những người có thể không đủ thành thạo để làm điều đó nếu họ không thể quản lý tuyến mã SQL.
Mark W Dickson

5
Đồng ý, Mark, nhưng trong giai đoạn đầu phát triển, tôi không cần phải viết một đống kịch bản.
Kristopher

7
Thật sốc khi đó là tháng 9 năm 2016 và lỗi không thân thiện với người dùng đáng kinh ngạc này (không có tùy chọn để hỏi "Này, bạn có muốn cho phép thay đổi bảng không?") Vẫn đang diễn ra. Không, bạn chỉ cần có một nút Hủy và phải thực hiện lại các thay đổi của mình. Máy chủ SQL ngu ngốc nhất.
Mike Gledhill

2
@Mike Gledhill Chúc mừng từ năm 2019 và đây vẫn là trường hợp LOL
Thuyền trưởng Kenpachi

116

Công cụ> Tùy chọn

nhập mô tả hình ảnh ở đây

Bỏ chọn tùy chọn trên


5
Cảm ơn ảnh chụp màn hình. Tôi đang tìm kiếm một cái gì đó như thế này để giúp tôi tìm thấy lựa chọn ngu ngốc đó. Hộp thoại sẽ có một hộp kiểm cho "làm điều đó bằng mọi cách" khi nó nói rằng bạn không thể.
Chris Benard

2
Cách thực hành tốt nhất Sau khi bạn thay đổi tùy chọn này là kiểm tra tùy chọn trên 'Tự động tạo tập lệnh thay đổi' để tránh mất dữ liệu
dubi

Cảm ơn vì hình ảnh. Nó rất hữu ích :)
M A.

72

Để khắc phục sự cố này, hãy sử dụng các câu lệnh SQL để thực hiện các thay đổi đối với cấu trúc siêu dữ liệu của bảng.

Sự cố này xảy ra khi tùy chọn "Ngăn chặn lưu thay đổi yêu cầu tạo lại bảng" được bật.

Nguồn: Thông báo lỗi khi bạn cố lưu bảng trong SQL Server 2008: "Không cho phép lưu thay đổi"


12
Câu hỏi của tôi ở đây là: tại sao SQL Server không sử dụng các câu lệnh T-SQL cần thiết thay vì bỏ và tạo lại bảng cho mỗi thay đổi? Tôi không thể hiểu hành vi này.
Jaime

15

Thay vì bỏ chọn hộp (một giải pháp kém), bạn nên DỪNG chỉnh sửa dữ liệu theo cách đó. Nếu dữ liệu phải được thay đổi, thì hãy thực hiện nó với một tập lệnh, để bạn có thể dễ dàng chuyển nó sang sản xuất và để nó nằm dưới sự kiểm soát nguồn. Điều này cũng giúp dễ dàng làm mới các thay đổi thử nghiệm sau khi sản xuất được đẩy xuống dev để cho phép các nhà phát triển làm việc chống lại dữ liệu mới hơn.


2
A) Bạn có thể sao chép tập lệnh SSMS tạo và sử dụng tập lệnh này trên môi trường sản xuất của bạn. B) SSMS thường dễ dàng hơn, nhanh hơn và an toàn hơn vì SSMS xử lý tất cả các chi tiết cho bạn.
Đã xem

2
Itg vẫn là một ý tưởng rất xấu. Bạn không muốn tạo lại bảng ghi 10.000, 000 trên prod. Nó không nhanh hơn. Làm thế nào là an toàn hơn? Dữ liệu xấu là dữ liệu xấu và kiểm tra tính nhất quán hoạt động nếu bạn sử dụng tập lệnh mà bạn đã viết cũng như nếu bạn để SSMS viết. Đó là thực hành POOR trong 100% các trường hợp.
HLGEM

15

ĐI đến SSMS và thử cái này

Menu >> Công cụ >> Tùy chọn >> Nhà thiết kế >> Bỏ chọn Ngăn chặn Lưu các thay đổi yêu cầu tạo lại bảng.

Dưới đây là một lời giải thích rất hay về điều này: http://blog.sqlauthority.com/2009/05/18/sql-server-fix-man Quản trị-studio -error-saving-changes-in-not-permit-the-changes -you-have-made-request-the-sau-bảng-to-be-drop-and-re-created-you-have-hoặc-made-thay-to-a-tab /


14

Nhiều thay đổi bạn có thể thực hiện rất dễ dàng và trực quan trong trình chỉnh sửa bảng trong SQL Server Management Studio thực sự yêu cầu SSMS thả bảng xuống nền và tạo lại từ đầu. Ngay cả những điều đơn giản như sắp xếp lại các cột cũng không thể được thể hiện trong câu lệnh DDL SQL tiêu chuẩn - tất cả các SSMS có thể làm là thả và tạo lại bảng.

Hoạt động này có thể là một) rất tốn thời gian trên một bảng lớn, hoặc b) thậm chí có thể thất bại vì nhiều lý do (như các ràng buộc và công cụ FK). Do đó, SSMS trong SQL Server 2008 đã giới thiệu tùy chọn mới mà các câu trả lời khác đã được xác định.

Ban đầu nó có vẻ phản trực giác để ngăn chặn những thay đổi như vậy - và chắc chắn nó gây phiền toái cho máy chủ dev. Nhưng trên một máy chủ sản xuất, tùy chọn này và giá trị mặc định của nó để ngăn chặn những thay đổi đó trở thành một trình cứu sinh tiềm năng!


2
Bây giờ tôi đang ở trên một máy chủ phát triển, nhưng trên một sản phẩm tôi chắc chắn sẽ bật lại. Cảm ơn một lần nữa cho kinh nghiệm chia sẻ
rem

1
Nhưng, ví dụ, việc thay đổi kích thước của cột nvarchar từ 100 thành 120 là thao tác rất đơn giản có thể dễ dàng thực hiện với ALTER TABLE ... vậy thì tại sao SQL Server (Management Studio) lại thả và tạo lại bảng cho như vậy các trường hợp?
Jaime

4
@Jaime: rằng bạn cần hỏi các nhà phát triển của nhà thiết kế hình ảnh đó - không ai biết. Đó chỉ là sự thật - với nhà thiết kế hình ảnh, nhiều thay đổi đơn giản sẽ luôn được thực hiện bằng cách tạo lại bảng và sao chép xung quanh. Nếu bạn muốn sử dụng cách tiếp cận đơn giản, bạn phải tự xử lý bằng cách viết một số câu lệnh T-SQL dễ dàng và thực hiện chúng.
marc_s

1
Cảm ơn bạn @marc_s Đây chính xác là câu trả lời tôi đang mong đợi, mặc dù tôi có rất ít niềm tin vào họ có một lý do ẩn giấu sẽ giải thích tất cả :)
Jaime

1
Hạn chế này cũng ngăn id đối tượng thay đổi mà bạn không biết (trong trường hợp bạn cần điều đó không xảy ra).
Đã xem

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.