Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Поле NOT NULL DEFERRABLE  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7862
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod

SQL> create table TEST (a number(9), b number(9));

Table created.

SQL> alter table TEST modify (
  2      a not null
  3    , b not null deferrable
  4  );

Table altered.

SQL> select column_name, nullable from cols where table_name = 'TEST';

COLUMN_NAME      NULLABLE
---------------- ----------------
A                N
B                Y

В одном случае из COLS видно, что поле NOT NULL, в другом нет, и сообщение об ошибке другое:

SQL> insert into TEST values (null, null);
insert into TEST values (null, null)
                         *
ERROR at line 1:
ORA-01400: cannot insert NULL into ("TEST"."A")


SQL> insert into TEST values (1, null);

1 row created.

SQL> commit;
commit
*
ERROR at line 1:
ORA-02091: transaction rolled back
ORA-02290: check constraint (SYS_C00484842) violated

Явное именование спасает, конечно, просто интересно знать, это так и задумано?
2 мар 07, 21:41    [3856739]     Ответить | Цитировать Сообщить модератору
 Re: Поле NOT NULL DEFERRABLE  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5931
ИМХО, вполне логично.

На insert он говорит
ORA-01400: cannot insert NULL into ("TEST"."A")


На commit
ORA-02290: check constraint (SYS_C00484842) violated

Не будет же он говорить cannot insert, если запись уже вставлена?!

Конечно сообщения такого рода для пользователя малоинформативны, тем более если ограничение называется SYS_C00484842. Досадно, что в БД нет человеческих описаний для ограничений целостности. В некоторых СУБД, я видел, что в каталог можно было внести текст сообщения для пользователя.
Я думаю, что тут нужно написать толмуд со всеми ограничениями БД и объяснением, что они означают для пользователя. Или пытаться парсить сообщения об ошибках и автоматизировать процесс.

Типа
SYS_C00484842 Поле "TEST"."B" должно иметь значение.
...
2 мар 07, 21:58    [3856794]     Ответить | Цитировать Сообщить модератору
 Re: Поле NOT NULL DEFERRABLE  [new]
Elic
Member

Откуда:
Сообщений: 29991
Если провести аналогию с deffered unique, реализованном на non-unique index, то логика, наверняка, есть. Типа deffered not null - это deffered check(is not null)
2 мар 07, 22:00    [3856800]     Ответить | Цитировать Сообщить модератору
 Re: Поле NOT NULL DEFERRABLE  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7862
Да случилось такое:

Создайте таблицу с обязательным полем на момент фиксации транзакции - создали.

create table TEST (A number(9) not null deferrable initially deferred);

Нет, все-таки сделайте это поле поле необязательным - вроде сделали:

SQL> alter table TEST modify A null;
alter table TEST modify A null
                        *
ERROR at line 1:
ORA-01451: column to be modified to NULL cannot be modified to NULL
На ошибку забили, мол, напутали что-то и оно уже необязательно. Потом всплыло:
SQL> insert into TEST values (null);

1 row created.

SQL> commit;
commit
*
ERROR at line 1:
ORA-02091: transaction rolled back
ORA-02290: check constraint (SYS_C007575) violated


SQL> select constraint_name, search_condition, deferrable 
  2  from USER_CONSTRAINTS 
  3  where table_name = 'TEST';

CONSTRAINT_NAME SEARCH_CONDITION               DEFERRABLE
--------------- ------------------------------ ------------------------------
SYS_C007575     "A" IS NOT NULL                DEFERRABLE
mcureenab

Я думаю, что тут нужно написать толмуд со всеми ограничениями БД и объяснением, что они означают для пользователя. Или пытаться парсить сообщения об ошибках и автоматизировать процесс.

Теперь именуем все отложенные ограничения.
create table TEST (A number(9) constraint NN_TEST_A not null deferrable initially deferred);
Просто подумал - вдруг бага этой версии, а раньше могло быть иначе.
3 мар 07, 02:20    [3857401]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить