Ini adalah kasus yang IDENTITY_INSERT hanya dapat diatur untuk ON di satu tabel database pada suatu waktu, tapi mengapa? Karena IDENTITY
kolom tidak unik secara global, saya tidak dapat memikirkan situasi berbahaya apa pun yang dapat disebabkan oleh memasukkan identitas ke lebih dari satu tabel pada saat yang sama (setidaknya tidak lebih berbahaya daripada umumnya memperdaya dengan IDENTITY INSERT).
INSENTITAS IDENTITAS harus jarang digunakan tetapi apa alasan untuk batas yang sulit?
sql-server
Ben Brocka
sumber
sumber
Jawaban:
Saya pikir itu untuk membuatnya sulit. Jika Anda bisa membiarkannya sepanjang waktu, mengapa harus memiliki bidang identitas?
Namun sebenarnya ada beberapa batasan:
Berdasarkan batasan yang berhubungan dengan koneksi, saya pikir itu terutama sehingga tidak pernah sengaja dinyalakan.
Bayangkan jika seseorang menyalakan ID sisipan di salah satu tabel Anda, maka Anda tidak menyadari dan dilakukan penyisipan yang tidak valid yang merusak integritas bidang ID Anda?
Ingatlah, bidang ID dapat memiliki nilai duplikat jika tidak ada kendala atau indeks unik di tempat ...
sumber
IDENTITY
juga menjadi kendala yang unik. Sangat mudah dibantah, tentu saja, jika mereka mau mencobanya.Tebakan saya adalah pembatasan karena implementasi. Mengizinkan pengaturan ini pada beberapa tabel adalah performa yang potensial:
Karena ini adalah parameter sesi, memungkinkan pengaturan untuk diaktifkan pada tabel tunggal berarti bahwa itu adalah flag sederhana dan id objek tabel untuk disimpan pada sesi, sisi server. Mungkin ini hanya satu bilangan bulat: 0 jika tidak ada IDENTITY_INSERT aktif, dan beberapa pengkodean databaseid + objectid untuk tabel.
Mengizinkan parameter ditetapkan pada beberapa tabel dalam satu sesi akan berarti bahwa server akan menyimpan daftar objek yang dinamis dan memeriksanya untuk setiap pernyataan penyisipan. Bayangkan sebuah sesi mengaktifkan parameter untuk seribu tabel:
Saya juga curiga bahwa set identity_insert on memiliki kinerja yang sangat baik di server. Dalam sybase ada " faktor pembakaran identitas ", yang memungkinkan untuk menyimpan nilai penghitung identitas suatu tabel untuk disimpan hanya sesekali (nilai disimpan dalam memori dan ditulis ke disk sesekali dan di server matikan ). SQL Server didasarkan pada kode yang sama sehingga mungkin memiliki beberapa optimasi yang sebanding, tetapi mengaktifkan identity_insert di atas meja mungkin membatasi server untuk menyimpan nilai identitas untuk setiap sisipan, karena selain itu tidak dapat menjamin ukuran celah maksimum. Jadi, jika satu sesi membuat hit kinerja pada sisipan dalam satu tabel ini mungkin dapat diterima, tetapi tidak jika itu dapat membuat perf hit pada semua tabel auto_increment di server ..
sumber
INSERT
dapat dilakukan pada satu waktu untuk satu sesi, dan saya dapat dengan mudah memasukkan 10 juta nilai hard-codedIDENTITY
.SET IDENTITY_INSERT
diaktifkan? Saya hanya menyarankan bahwa ukuran celah tidak mempengaruhi beberapa tabel berbeda dari itu mempengaruhi satu tabel.