Я массово обновляю базу данных 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 после или во время обновления типа данных, но мне действительно любопытно, что может быть причиной этого.
источник
Ответы:
Это зависит от ваших настроек SET ANSI_NULL_DFLT_OFF или SET ANSI_NULL_DFLT_ON (ознакомьтесь с другими эффектами также из SET ANSI_DEFAULTS).
Лично я бы определил это ограничение явно, если бы я хотел пустые или ненулевые столбцы, а не полагался на настройки среды.
Вы можете выполнить эту команду еще раз, и если столбец уже имеет желаемое значение обнуляемости, команда игнорируется.
Тем не менее, вы также сказали, что вам нужно только изменить его там, где он является частью первичного ключа. Это не должно иметь никакого отношения к тому, может ли столбец обнуляться или нет на этапе моделирования / реализации.
источник
SET ANSI_NULL_DFLT_ON
здесь не применяется ANSI_NULL значения по умолчанию всегда включены для ALTER COLUMN; если не указан, столбец обнуляется.