Почему при запуске ALTER TABLE для столбца он переходит из NOT NULL в NULL?


8

Я массово обновляю базу данных SQL Server. Я изменяю все наши numeric(38,0)столбцы на int (да, сценарии SQL Server были созданы из сценариев Oracle) . Используя SMO и C # (я - инженер sw) , мне удалось создать действительно хорошие сценарии, как в SQL Server Management studio . Все это работает очень хорошо, за исключением одной конкретной проблемы:

для нескольких таблиц, когда я звоню, ALTER TABLE [myTable] ALTER COLUMN [columnA] INTон решает также изменить столбец NOT NULL to NULL. Это, конечно, огромная проблема, так как мне нужно регенерировать первичные ключи для большинства таблиц в этих столбцах.

Очевидно, у меня есть множество вариантов использования SMO, чтобы выяснить, какие столбцы являются первичными ключами, и заставить их быть NULL после или во время обновления типа данных, но мне действительно любопытно, что может быть причиной этого.


Вы можете узнать это, если столбцы являются членами первичного ключа через T / SQL. SMO не требуется.
Мрденни

Ответы:


10

Это зависит от ваших настроек SET ANSI_NULL_DFLT_OFF или SET ANSI_NULL_DFLT_ON (ознакомьтесь с другими эффектами также из SET ANSI_DEFAULTS).

Лично я бы определил это ограничение явно, если бы я хотел пустые или ненулевые столбцы, а не полагался на настройки среды.

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

Вы можете выполнить эту команду еще раз, и если столбец уже имеет желаемое значение обнуляемости, команда игнорируется.

Тем не менее, вы также сказали, что вам нужно только изменить его там, где он является частью первичного ключа. Это не должно иметь никакого отношения к тому, может ли столбец обнуляться или нет на этапе моделирования / реализации.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.