Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Primary Key column become NULLable during online table redifinition / 11 сообщений из 11, страница 1 из 1
17.08.2016, 19:07:31
    #39293516
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Primary Key column become NULLable during online table redifinition
Зацените феномен, проявляющийся при использовании Online table redefinition :

До:OWNER CONSTRAINT_NAMECSEARCH_CONDITIONR_OWNERR_CONSTRAINT_NAMESTATUS DEFERRED VALIDATEDINVALIDCOLUMN_NAMEPOSITIONNCLFXINT_OWNERT1_PK P ENABLEDIMMEDIATEVALIDATED TRADE_ID 1N
После:OWNER CONSTRAINT_NAMECSEARCH_CONDITIONR_OWNERR_CONSTRAINT_NAMESTATUS DEFERRED VALIDATEDINVALIDCOLUMN_NAMEPOSITIONNCLFXINT_OWNERT1_PK P ENABLEDIMMEDIATEVALIDATED TRADE_ID 1Y
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Data Mining
and Real Application Testing options

SQL>-- Create table
SQL>create table t1
  2  (
  3    trade_id   NUMBER(18) constraint t1_pk primary key,
  4    be_id      NUMBER
  5  )
  6  ;

Table created.

SQL>select c.owner, c.constraint_name, c.constraint_type, c.search_condition, c.r_owner, c.r_constraint_name,
  2         c.status, c.deferred, c.validated, c.invalid,
  3         cc.column_name, cc.position,
  4         tc.nullable
  5  from all_constraints c
  6  inner join all_cons_columns cc
  7  on (c.owner = cc.owner and c.constraint_name = cc.constraint_name and c.table_name = cc.table_name)
  8  inner join all_tab_columns tc
  9  on (c.owner = tc.owner and c.table_name = tc.table_name and cc.column_name = tc.column_name)
 10  where c.owner = user
 11    and c.table_name = 'T1'
 12  order by c.constraint_name, cc.position
 13  ;
OWNER         CONSTRAINT_NAME C SEARCH_CONDITION R_OWNER R_CONSTRAINT_NAME STATUS  DEFERRED  VALIDATED INVALID COLUMN_NAME POSITION N
------------- --------------- - ---------------- ------- ----------------- ------- --------- --------- ------- ----------- -------- -
CLFXINT_OWNER T1_PK           P                                            ENABLED IMMEDIATE VALIDATED         TRADE_ID           1 N


SQL>create table i_t1
  2  (
  3    trade_id                    NUMBER(18),
  4    be_id                       NUMBER,
  5    hot_yn                      CHAR(1) DEFAULT 'N' NOT NULL,
  6    CONSTRAINT t1_check_hot_yn CHECK (hot_yn IN ('Y','N'))
  7  )
  8  PARTITION BY LIST (be_id)
  9  SUBPARTITION BY LIST (hot_yn)
 10    ( PARTITION t1_DEFAULT VALUES (DEFAULT)
 11      (SUBPARTITION t1_DEFAULT_HOT_Y VALUES('Y'),
 12       SUBPARTITION t1_DEFAULT_HOT_N VALUES('N')
 13      )
 14    )
 15  ;

Table created.

SQL>alter table i_t1 enable row movement;

Table altered.

SQL>BEGIN
  2      DBMS_REDEFINITION.can_redef_table(USER, 'T1');
  3  END;
  4  /

PL/SQL procedure successfully completed.

SQL>--1. Start redefinition
SQL>BEGIN
  2      DBMS_REDEFINITION.start_redef_table(USER, 'T1','I_T1');
  3  END;
  4  /

PL/SQL procedure successfully completed.

SQL>--2. Copy table dependents
SQL>DECLARE
  2      v_num_errors NUMBER;
  3  BEGIN
  4      DBMS_REDEFINITION.copy_table_dependents(
  5           uname => USER,
  6           orig_table => 'T1',
  7           int_table => 'I_T1',
  8           copy_indexes => 0,
  9           copy_triggers => TRUE,
 10           copy_constraints => TRUE,
 11           copy_privileges => TRUE,
 12           ignore_errors => FALSE,
 13           num_errors => v_num_errors,
 14           copy_statistics => FALSE,
 15           copy_mvlog => FALSE
 16           );
 17
 18      IF v_num_errors > 0 THEN
 19         DBMS_REDEFINITION.abort_redef_table(
 20              uname => USER,
 21              orig_table => 'T1',
 22              int_table => 'I_T1'
 23              );
 24
 25         RAISE_APPLICATION_ERROR(-20001,'Error in DBMS_REDEFINITION.copy_table_dependents');
 26      END IF;
 27
 28      DBMS_REDEFINITION.sync_interim_table(
 29           uname => USER,
 30           orig_table => 'T1',
 31           int_table => 'I_T1'
 32           );
 33
 34      DBMS_REDEFINITION.finish_redef_table(
 35           uname => USER,
 36           orig_table => 'T1',
 37           int_table => 'I_T1'
 38           );
 39  end;
 40  /

PL/SQL procedure successfully completed.

SQL>select c.owner, c.constraint_name, c.constraint_type, c.search_condition, c.r_owner, c.r_constraint_name,
  2         c.status, c.deferred, c.validated, c.invalid,
  3         cc.column_name, cc.position,
  4         tc.nullable
  5  from all_constraints c
  6  inner join all_cons_columns cc
  7  on (c.owner = cc.owner and c.constraint_name = cc.constraint_name and c.table_name = cc.table_name)
  8  inner join all_tab_columns tc
  9  on (c.owner = tc.owner and c.table_name = tc.table_name and cc.column_name = tc.column_name)
 10  where c.owner = user
 11    and c.table_name = 'T1'
 12  order by c.constraint_name, cc.position
 13  ;
OWNER         CONSTRAINT_NAME C SEARCH_CONDITION     R_OWNER R_CONSTRAINT_NAME STATUS  DEFERRED  VALIDATED INVALID COLUMN_NAME POSITION N
------------- --------------- - -------------------- ------- ----------------- ------- --------- --------- ------- ----------- -------- -
CLFXINT_OWNER SYS_C0042071    C "HOT_YN" IS NOT NULL                           ENABLED IMMEDIATE VALIDATED         HOT_YN               N
CLFXINT_OWNER T1_CHECK_HOT_YN C hot_yn IN ('Y','N')                            ENABLED IMMEDIATE VALIDATED         HOT_YN               N
CLFXINT_OWNER T1_PK           P                                                ENABLED IMMEDIATE VALIDATED         TRADE_ID           1 Y
...
Рейтинг: 0 / 0
18.08.2016, 10:20:51
    #39293736
orawish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Primary Key column become NULLable during online table redifinition
--Eugene--,

а где криминал?
просто железная пила решила указать автору тая redefinition, что он жжёт ;)

попробуйте в исходной таблице добавить явно not null в спецификацию столбца ключа
...
Рейтинг: 0 / 0
18.08.2016, 11:07:34
    #39293771
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Primary Key column become NULLable during online table redifinition
orawish,

Криминал в том, что руками (без redefinition) вы такого сделать не сможете.
...
Рейтинг: 0 / 0
18.08.2016, 11:22:51
    #39293784
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Primary Key column become NULLable during online table redifinition
--Eugene--,

В этом никакого криминала нет. Тем более, что имея шаловливые ручки и доступ к таблицам словаря можно и не такое.
Криминал будет если после этого полетят планы запросов. Null то все одно не должно давать вставлять. Если дает, то это уже тянет не просто на криминал...
...
Рейтинг: 0 / 0
18.08.2016, 11:42:19
    #39293804
p2.
p2.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Primary Key column become NULLable during online table redifinition
вероятно перенос констрейнтов реализован непосредственным копированием словарных yданных и ветвление кода про ПК ревлизовано без nullable.
в некоторых версиях ПК не давал в словаре nullable, только в сочетании с not null.
...
Рейтинг: 0 / 0
18.08.2016, 11:56:38
    #39293819
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Primary Key column become NULLable during online table redifinition
Сергей АрсеньевNull то все одно не должно давать вставлять. Если дает, то это уже тянет не просто на криминал...даёт, даёт ))
...
Рейтинг: 0 / 0
18.08.2016, 16:08:12
    #39294033
guest4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Primary Key column become NULLable during online table redifinition
Новая таблица может быть точно такой же как и исходная (без партиционирования, без изменения столбцов)

Заголовок
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
column constraint_name format a12
column column_name format a12

create table t1
(
  trade_id integer constraint t1_pk primary key,
  cust_id  integer
)
;

select c.constraint_name, c.constraint_type, c.status, c.deferred, c.validated, c.invalid,
       cc.column_name, cc.position,
       tc.nullable
from all_constraints c
inner join all_cons_columns cc
on (c.owner = cc.owner and c.constraint_name = cc.constraint_name and c.table_name = cc.table_name)
inner join all_tab_columns tc
on (c.owner = tc.owner and c.table_name = tc.table_name and cc.column_name = tc.column_name)
where c.owner = user
  and c.table_name = 'T1'
order by c.constraint_name, cc.position
;

-------------
create table i_t1
(
  trade_id integer,
  cust_id  integer
)
;

alter table i_t1 enable row movement;

declare
    v_num_errors number;
begin
    dbms_redefinition.can_redef_table(user, 'T1');
    dbms_redefinition.start_redef_table(user, 'T1','I_T1');
    dbms_redefinition.copy_table_dependents(
         uname => USER,
         orig_table => 'T1',
         int_table => 'I_T1', 
         copy_indexes => 0,
         copy_triggers => true,
         copy_constraints => true,
         copy_privileges => true,
         ignore_errors => false,
         num_errors => v_num_errors,
         copy_statistics => false,
         copy_mvlog => false
         );
         
    if v_num_errors > 0 then
       dbms_redefinition.abort_redef_table(uname => USER, orig_table => 'T1', int_table => 'I_T1');
       raise_application_error(-20001,'Error in DBMS_REDEFINITION.copy_table_dependents');
    end if;

    dbms_redefinition.sync_interim_table(uname => user, orig_table => 'T1', int_table => 'I_T1');
    dbms_redefinition.finish_redef_table(uname => user, orig_table => 'T1', int_table => 'I_T1');
end;
/

select c.constraint_name, c.constraint_type, c.status, c.deferred, c.validated, c.invalid,
       cc.column_name, cc.position,
       tc.nullable
from all_constraints c
inner join all_cons_columns cc
on (c.owner = cc.owner and c.constraint_name = cc.constraint_name and c.table_name = cc.table_name)
inner join all_tab_columns tc
on (c.owner = tc.owner and c.table_name = tc.table_name and cc.column_name = tc.column_name)
where c.owner = user
  and c.table_name = 'T1'
order by c.constraint_name, cc.position
;




в результате имеем
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SQL>
Table created
CONSTRAINT_N CONSTRAINT_TYPE STATUS   DEFERRED  VALIDATED     INVALID COLUMN_NAME    POSITION NULLABLE
------------ --------------- -------- --------- ------------- ------- ------------ ---------- --------
T1_PK        P               ENABLED  IMMEDIATE VALIDATED             TRADE_ID              1 N
Table created
Table altered
PL/SQL procedure successfully completed
CONSTRAINT_N CONSTRAINT_TYPE STATUS   DEFERRED  VALIDATED     INVALID COLUMN_NAME    POSITION NULLABLE
------------ --------------- -------- --------- ------------- ------- ------------ ---------- --------
T1_PK        P               ENABLED  IMMEDIATE VALIDATED             TRADE_ID              1 Y

SQL>



NULL вставляется.
alter table t1 enable validate constaint t1_pk; не помогает.

в доке 11.2
copy_constraints TRUE = clone constraints, FALSE = do nothing. If compatibility
setting is 10.2 or higher, then clone CHECK and NOT NULL constraints

P.S. Похоже баг специфичен для версии, платформы.
Для линукса x86 11.2.0.4 64-bit есть
виндоус 11.2.0.1 64-bit нет - t1_pk получается в 'NOT VALIDATED' и после alter ... enable столбец получается not null
...
Рейтинг: 0 / 0
18.08.2016, 16:50:12
    #39294075
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Primary Key column become NULLable during online table redifinition
--Eugene--даёт, даёт ))
С другой стороны добавить же not null constraint она не мешает?
...
Рейтинг: 0 / 0
18.08.2016, 19:59:28
    #39294214
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Primary Key column become NULLable during online table redifinition
Сергей АрсеньевС другой стороны добавить же not null constraint она не мешает?Даже если я добавлю ALTER TABLE T1 ADD CONSTRAINT C1 CHECK(TRADE_ID IS NOT NULL), это не сделает колонку NOT-NULLABLE. Нужно делать ALTER TABLE T1 MODIFY (TRADE_ID NOT NULL). Только после этого оптимизатор начнет выбирать более оптимальный план на основе того что колонка не может быть пустой. Хотя, это не важно сейчас.
А что касается вашего вопроса, вы и правда считаете что это нормальное поведение СУБД ?

Нет, я бы еще понял, если бы NULL в качестве PK можно было вставить только один раз))
...
Рейтинг: 0 / 0
19.08.2016, 08:29:58
    #39294328
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Primary Key column become NULLable during online table redifinition
--Eugene-- вы и правда считаете что это нормальное поведение СУБД ?
Неа. Но воркараунд не сложный. Просто надо быть более внимательным при выполнении redefinition. Ну или заказать Oracle, чтоб они пофиксили это.
...
Рейтинг: 0 / 0
19.08.2016, 08:31:12
    #39294330
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Primary Key column become NULLable during online table redifinition
--Eugene--Нет, я бы еще понял, если бы NULL в качестве PK можно было вставить только один раз))
А вот это уже расхождение с идеологией Oracle. Уникальность здесь проверяет индекс. А Null в него не попадают. :)
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Primary Key column become NULLable during online table redifinition / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]