Mengapa menjalankan ALTER TABLE pada kolom menyebabkannya beralih dari NOT NULL ke NULL?

8

Saya secara massal memperbarui database SQL Server. Saya mengubah semua numeric(38,0)kolom kami menjadi int (ya, skrip SQL Server dibuat dari skrip Oracle) . Menggunakan SMO dan C # (saya seorang insinyur sw) , saya berhasil membuat skrip yang sangat bagus seperti studio SQL Server Management . Semuanya bekerja dengan sangat baik kecuali untuk satu masalah tertentu:

untuk beberapa tabel, ketika saya menyebutnya ALTER TABLE [myTable] ALTER COLUMN [columnA] INTmemutuskan juga mengubah kolom dari NOT NULL to NULL. Itu tentu saja merupakan masalah besar karena saya perlu membuat ulang kunci utama untuk sebagian besar tabel di kolom-kolom tertentu.

Jelas, saya memiliki banyak pilihan menggunakan SMO untuk mengetahui kolom mana yang merupakan kunci utama dan memaksa mereka untuk TIDAK NULL setelah atau saat saya memperbarui tipe data, tetapi saya benar-benar ingin tahu apa yang dapat menyebabkan ini.

Eric Liprandi
sumber
Anda dapat mengetahui hal ini jika kolom adalah anggota kunci utama melalui T / SQL juga. SMO tidak diperlukan.
mrdenny

Jawaban:

10

Itu tergantung pada pengaturan SET ANSI_NULL_DFLT_OFF atau SET ANSI_NULL_DFLT_ON (baca ini untuk efek lain juga dari SET ANSI_DEFAULTS).

Secara pribadi, saya telah menentukan batasan ini secara eksplisit jika saya ingin kolom nol atau non nol daripada mengandalkan pengaturan lingkungan.

ALTER TABLE [myTable] ALTER COLUMN [columnA] INT NOT NULL

Anda bisa mengeluarkan perintah ini lagi dan jika kolom sudah pada nullability yang diinginkan perintah diabaikan.

Namun, Anda juga mengatakan bahwa Anda hanya perlu mengubahnya di mana itu merupakan bagian dari kunci utama. Seharusnya tidak ada kaitannya pada apakah suatu kolom dapat dibatalkan atau tidak dari tahap pemodelan / implementasi

gbn
sumber