Menyimpan perubahan setelah tabel diedit di SQL Server Management Studio

265

Jika saya ingin menyimpan perubahan apa pun dalam tabel, yang sebelumnya disimpan di SQL Server Management Studio (tidak ada data dalam tabel) saya mendapatkan pesan kesalahan:

Menyimpan perubahan tidak diizinkan. Perubahan yang telah Anda buat mengharuskan tabel berikut untuk dijatuhkan dan dibuat kembali. Anda telah membuat perubahan pada tabel yang tidak dapat dibuat kembali atau mengaktifkan opsi. Mencegah menyimpan perubahan yang mengharuskan tabel dibuat kembali.

Apa yang bisa mencegah tabel agar mudah diedit? Atau, apakah ini cara biasa untuk SQL Server Management Studio untuk meminta pembuatan kembali tabel untuk diedit? Apa itu - "opsi Cegah perubahan simpanan" ini ?

rem
sumber
4
kemungkinan duplikat dari perubahan Tabungan tidak diizinkan di SQL Server
Pang
1
@ Peter - Pertanyaan ini datang lebih dulu, ini duplikat.
GrandMasterFlush
@ Peter - Saya tidak tahu itu, terima kasih.
GrandMasterFlush

Jawaban:

573

Pergilah ke Alat -> Opsi -> Desainer-> Hapus centang "Cegah perubahan simpanan yang memerlukan pembuatan ulang tabel". Voila.

Itu terjadi karena kadang-kadang perlu untuk menjatuhkan dan membuat ulang tabel untuk mengubah sesuatu. Ini bisa memakan waktu cukup lama, karena semua data harus disalin ke tabel temp dan kemudian dimasukkan kembali ke tabel baru. Karena SQL Server secara default tidak mempercayai Anda, Anda perlu mengatakan "OK, saya tahu apa yang saya lakukan, sekarang biarkan saya melakukan pekerjaan saya."

Pedro
sumber
8
Situs Dukungan Microsoft tidak mendukung hal ini, tetapi jika Anda tidak memiliki data di tabel, saya tidak melihat bahayanya. Mungkin lebih baik menggunakan TSQL untuk melakukan perubahan.
Jon Smock
6
Saya pribadi akan menyarankan menggunakan perancang untuk basis data penting. Saya telah melihatnya melakukan kesalahan mahal pada banyak kesempatan. Selain itu, ini mempromosikan kebiasaan pengembangan malas dan memungkinkan orang untuk memodifikasi struktur database yang mungkin tidak cukup mahir untuk melakukannya jika mereka tidak dapat mengelola rute kode SQL.
Mark W Dickson
5
Setuju, Mark, namun dalam pengembangan awal saya tidak perlu menulis setumpuk naskah.
Kristopher
7
Mengejutkan bahwa ini September 2016, dan kesalahan pengguna-tidak ramah yang luar biasa ini (tanpa opsi untuk bertanya "Hei, apakah Anda ingin MENGIZINKAN perubahan tabel?") Masih dalam proses. Tidak, Anda hanya mendapatkan tombol Batal, dan harus melakukan perubahan lagi. SQL Server paling bodoh.
Mike Gledhill
2
@Mike Gledhill Salam dari 2019 dan ini masih terjadi LOL
Kapten Kenpachi
116

Alat> Opsi

masukkan deskripsi gambar di sini

Hapus centang opsi di atas

Prasanna
sumber
5
Terima kasih untuk tangkapan layarnya. Saya mencari sesuatu seperti ini untuk membantu saya menemukan opsi bodoh itu. Dialog harus memiliki kotak centang untuk "tetap melakukannya" ketika dikatakan Anda tidak bisa.
Chris Benard
2
Praktik Terbaik Setelah Anda mengubah opsi ini adalah untuk memeriksa opsi atas 'Auto menghasilkan skrip perubahan' untuk mencegah kehilangan data
dubi
Terima kasih untuk Gambarnya. Ini sangat berguna :)
M A.
72

Untuk mengatasi masalah ini, gunakan pernyataan SQL untuk membuat perubahan pada struktur metadata tabel.

Masalah ini terjadi ketika opsi "Cegah penyimpanan perubahan yang memerlukan pembuatan ulang tabel" diaktifkan.

Sumber: Pesan galat saat Anda mencoba untuk menyimpan tabel di SQL Server 2008: "Menyimpan perubahan tidak diizinkan"

Daniel Vassallo
sumber
12
Pertanyaan saya di sini adalah: mengapa SQL Server tidak menggunakan pernyataan T-SQL yang diperlukan alih-alih menjatuhkan dan membuat ulang tabel untuk setiap perubahan tunggal? Saya tidak bisa mengerti perilaku ini.
Jaime
15

Daripada menghapus centang pada kotak (solusi yang buruk), Anda harus BERHENTI mengedit data dengan cara itu. Jika data harus diubah, maka lakukan dengan skrip, sehingga Anda dapat dengan mudah porting ke produksi dan sehingga di bawah kendali sumber. Ini juga membuatnya lebih mudah untuk me-refresh perubahan pengujian setelah produksi telah didorong ke dev untuk memungkinkan pengembang untuk bekerja melawan data yang lebih segar.

HLGEM
sumber
2
A) Anda dapat menyalin skrip yang dihasilkan SSMS dan menggunakannya pada lingkungan produksi Anda. B) SSMS seringkali lebih mudah, lebih cepat, dan lebih aman karena SSMS menangani semua detail untuk Anda.
Dipotong
2
Itg masih merupakan ide yang sangat buruk. Anda tidak ingin membuat ulang 10.000, 000 tabel catatan pada prod. Itu tidak lebih cepat. Bagaimana ini lebih aman? Data buruk adalah data buruk dan konsistensi memeriksa berfungsi jika Anda menggunakan skrip yang Anda tulis serta jika Anda membiarkan SSMS menulisnya. Ini adalah praktik MISKIN dalam 100% kasus.
HLGEM
14

Banyak perubahan yang dapat Anda buat dengan sangat mudah dan visual dalam editor tabel di SQL Server Management Studio sebenarnya membutuhkan SSMS untuk menjatuhkan tabel di latar belakang dan membuat ulang dari awal. Bahkan hal-hal sederhana seperti menata ulang kolom tidak dapat diekspresikan dalam pernyataan standar SQL DDL - semua SSMS dapat lakukan adalah menjatuhkan dan membuat ulang tabel.

Operasi ini dapat a) sangat memakan waktu di atas meja besar, atau b) bahkan mungkin gagal karena berbagai alasan (seperti kendala dan hal-hal FK). Oleh karena itu, SSMS di SQL Server 2008 memperkenalkan bahwa opsi baru jawaban lain telah diidentifikasi.

Ini mungkin tampak kontra-intuitif pada awalnya untuk mencegah perubahan seperti itu - dan ini tentu saja merupakan gangguan pada server dev. Tetapi pada server produksi, opsi ini dan nilai default untuk mencegah perubahan tersebut menjadi penyelamat yang potensial!

marc_s
sumber
2
Saya sekarang di server pengembangan, tetapi pada produksi saya pasti akan menyalakannya kembali. Terima kasih sekali lagi untuk berbagi pengalaman
rem
1
Tetapi, misalnya, mengubah ukuran kolom nvarchar dari 100 menjadi 120 adalah operasi yang sangat mudah yang dapat dengan mudah dilakukan dengan ALTER TABLE ... lalu, mengapa SQL Server (Management Studio) menjatuhkan dan membuat ulang tabel untuk seperti kasus?
Jaime
4
@Jaime: Anda perlu bertanya kepada pengembang perancang visual itu - tidak ada orang lain yang tahu. Ini hanya fakta - dengan perancang visual, banyak perubahan langsung akan selalu dilakukan dengan membuat ulang tabel dan menyalin. Jika Anda ingin menggunakan pendekatan langsung, terserah Anda untuk menanganinya sendiri dengan menulis beberapa pernyataan T-SQL yang mudah dan menjalankannya.
marc_s
1
Terima kasih @marc_s Ini persis jawaban yang saya harapkan, meskipun saya kurang percaya pada mereka memiliki alasan tersembunyi yang akan menjelaskan semuanya :)
Jaime
1
Pembatasan ini juga mencegah id objek agar tidak berubah tanpa Anda sadari (jika Anda perlu itu tidak terjadi).
Dipotong