Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Sybase ASA, ASE, IQ Новый топик    Ответить
 Sybase ASE: constraints. Странное контексто-зависимое поведение  [new]
Mikle83
Member

Откуда: Санкт-Петербург
Сообщений: 609
Понятно, что задача растет из не совсем корректной реализации, но интересный эффект.
Создаем таблицу, в которой поля могут быть NULL и забиваем ее данными.

create table #tmp (ID int null, Txt varchar(10) Null
go
insert into #tmp(ID, Txt) Select Null, 'a' Union Select Null, 'b'
go


вдруг решаем, что довольно безобразия - отныне в ID никогда не должны попадать NULL, но уже там существующие - пусть живут.
имплементируем это незатейливым способом (сразу отмечу, ноль выбран чисто как показательный пример и понятно, что мы здесь еще и его отсекаем, но суть не в этом)
alter table #tmp add constraint ID_NOT_NULL Check (IsNull(ID,0) <> 0)
go


тут начинается интересное:
insert into #tmp(Txt) Select 'c' union select 'd'
go

Валится с ошибкой по констреинту. но если делаем так:
insert into #tmp(ID, Txt) Select Null, 'a' Union Select Null, 'b'
go

продолжаем успешно забивать таблицу нуллами.

Т.е. ежели колонку явно указать в инсерт/апдейте и определить как = NULL - констреинт побоку.
Ежели колонка явно в запросе не указана - хватаем (в какой-то степени ожидаемый) эксепшен.

ИМХО, странное поведение, ожидается, что всегда будет эксепшен, либо уже пятница сказывается...
3 фев 17, 19:56    [20178984]     Ответить | Цитировать Сообщить модератору
Все форумы / Sybase ASA, ASE, IQ Ответить