powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / инвалидация views при удалении уникального индекса
11 сообщений из 11, страница 1 из 1
инвалидация views при удалении уникального индекса
    #40106641
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто подскажет, почему при удалении уникального индекса инвалидируются зависимые от таблицы views?
При чем только views, всё остальное - пакеты, функции, триггеры остаются валидными.
Особенно доставляет, что в цепочке table => editioning view => view при удалении уникального индекса в таблице, editioning view не инвалидируется, а основанная на ней view - становится INVALID.


Код: 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.
SQL> select banner_full from v$version;
BANNER_FULL
--------------------------------------------------------------------------------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.4.0.0.0

SQL> create table TEST_TABLE_20211025 ( id1 number, id2 number, text varchar2(128) );
Table created

SQL> insert into TEST_TABLE_20211025 ( id1, id2, text ) select rownum, mod( rownum, 10 ) + 1, table_name from dba_tables;
7318 rows inserted

SQL> commit;
Commit complete

SQL> create unique index IDX_TEST_TABLE_20211025 on TEST_TABLE_20211025 (id1, id2, text);
Index created

SQL> create or replace view V_TEST_TABLE_20211025 as select id1, id2, text from TEST_TABLE_20211025;
View created

SQL> select object_name, object_type, status from dba_objects where object_name like '%20211025%';
OBJECT_NAME                  OBJECT_TYPE             STATUS
---------------------------- ----------------------- -------
IDX_TEST_TABLE_20211025      INDEX                   VALID
V_TEST_TABLE_20211025        VIEW                    VALID
TEST_TABLE_20211025          TABLE                   VALID

SQL> drop index IDX_TEST_TABLE_20211025;
Index dropped

SQL> select object_name, object_type, status from dba_objects where object_name like '%20211025%';
OBJECT_NAME                  OBJECT_TYPE             STATUS
---------------------------- ----------------------- -------
V_TEST_TABLE_20211025        VIEW                    INVALID
TEST_TABLE_20211025          TABLE                   VALID
...
Рейтинг: 0 / 0
инвалидация views при удалении уникального индекса
    #40106711
Alexander Anokhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это сделано для корректной поддержки т.н. обновляемых представлений и словаря, например *_updatable_columns, которые от отсутствия уникального индекса могут перестать быть обновляемыми.
...
Рейтинг: 0 / 0
инвалидация views при удалении уникального индекса
    #40106715
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разве они обновляются по любому уникальному индексу, а не только по первичному
ключу или даже rowid?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
инвалидация views при удалении уникального индекса
    #40106719
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Разве они обновляются по любому уникальному индексу, а не только по первичному
ключу или даже rowid?

ROWID для этого совсем не годится.

А про то, к чему относится упомянутый индекс ТС не уточнил.

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

Первичный ключ - это то, что надо.
Плюс содержание самого view, которое тоже определяет какие столбцы можно обновлять.
...
Рейтинг: 0 / 0
инвалидация views при удалении уникального индекса
    #40106735
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Anokhin
Это сделано для корректной поддержки т.н. обновляемых представлений и словаря, например *_updatable_columns, которые от отсутствия уникального индекса могут перестать быть обновляемыми.

View может быть updatable и без индексов.
Вдобавок в моем примере индекс построен на столбцах nullable и в принципе не может служить однозначным определением всех строк в таблице.
...
Рейтинг: 0 / 0
инвалидация views при удалении уникального индекса
    #40106736
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Anokhin,

вьюшка очень простая, там нет джоинов,
у такого вью updatable_columns не должен зависеть от наличия/отсутсвия индекса

.....
stax
...
Рейтинг: 0 / 0
инвалидация views при удалении уникального индекса
    #40106743
Alexander Anokhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

Разве они обновляются по любому уникальному индексу, а не только по первичному
ключу или даже rowid?


Уникальность гарантирует key-preserved.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
drop table t1;
drop table t2;

create table t1 ( x number );
create table t2 ( y number );

create unique index i1 on t1(x);

create or replace view v
as 
select *
  from t1, 
       t2
 where t1.x = t2.y;

select column_name,
       updatable, 
       insertable, 
       deletable
  from user_updatable_columns 
 where table_name = 'V';

Код: plaintext
1.
2.
3.
4.
COLUMN_NAME UPD INS DEL
----------- --- --- ---
X           NO  NO  NO 
Y           YES YES YES

Код: plsql
1.
2.
update v 
   set x = 0;


Код: plaintext
1.
ORA-01779: cannot modify a column which maps to a non key-preserved table

Код: plsql
1.
2.
update v 
   set y = 0;

Код: plaintext
1.
0 rows updated.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
drop index i1;

alter view v compile;

select column_name,
       updatable, 
       insertable, 
       deletable
  from user_updatable_columns 
 where table_name = 'V';

Код: plaintext
1.
2.
3.
4.
COLUMN_NAME UPD INS DEL
----------- --- --- ---
X           NO  NO  NO 
Y           NO  NO  NO 

Код: plsql
1.
2.
update v 
   set y = 1;

Код: plaintext
1.
ORA-01779: cannot modify a column which maps to a non key-preserved table


Начиная с 19.10, Оракл пытается делать update view даже без key-reserved.
...
Рейтинг: 0 / 0
инвалидация views при удалении уникального индекса
    #40106746
Alexander Anokhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexFF__|
Alexander Anokhin
Это сделано для корректной поддержки т.н. обновляемых представлений и словаря, например *_updatable_columns, которые от отсутствия уникального индекса могут перестать быть обновляемыми.

View может быть updatable и без индексов.
Вдобавок в моем примере индекс построен на столбцах nullable и в принципе не может служить однозначным определением всех строк в таблице.

Не важно какая она может быть без индексов. Важно, что с удалением уникального индекса представление может потерять важные свойства с изменением словаря, и должно быть перекомпилировано, чтобы всё это правильно поправить. Очевидно, что это не дожно происходить во время удаления индекса.
...
Рейтинг: 0 / 0
инвалидация views при удалении уникального индекса
    #40106767
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Anokhin
Начиная с 19.10, Оракл пытается делать update view даже без key-reserved.
Начинание хрошее, но реализация хромает.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
drop table t1;
drop table t2;
drop view v;

create table t1 as select rownum id, 'a'||rownum name from dual connect by level < 5;
create table t2 as select rownum id, 'a'||rownum name from dual connect by level < 5;

create view v as
select t1.*, t2.name name2
from t1 join t2 on t1.id = t2.id;

update v set name = name2;
insert into t1 values (1, 'aa');
update v set name = name2;
insert into t2 values (2, 'bb');
update v set name = name2;
insert into t2 values (2, 'cc');
update v set name = name2;

select * from v order by 1, 2, 3;
select version_full from product_component_version;


Код: 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.
SQL> create view v as
  2  select t1.*, t2.name name2
  3  from t1 join t2 on t1.id = t2.id;

View created.

SQL>
SQL> update v set name = name2;

4 rows updated.

SQL> insert into t1 values (1, 'aa');

1 row created.

SQL> update v set name = name2;

5 rows updated.

SQL> insert into t2 values (2, 'bb');

1 row created.

SQL> update v set name = name2;

6 rows updated.

SQL> insert into t2 values (2, 'cc');

1 row created.

SQL> update v set name = name2;
update v set name = name2
*
ERROR at line 1:
ORA-30926: unable to get a stable set of rows in the source tables


SQL>
SQL> select * from v order by 1, 2, 3;

        ID NAME                                      NAME2
---------- ----------------------------------------- -----------------------------------------
         1 a1                                        a1
         1 a1                                        a1
         2 bb                                        a2
         2 bb                                        bb
         2 bb                                        cc
         3 a3                                        a3
         4 a4                                        a4

7 rows selected.

SQL> select version_full from product_component_version;

VERSION_FULL
------------------------------------------------------------------------------------------------------------------------------------------------------
21.3.0.0.0

Выделенное не должно было пройти.
...
Рейтинг: 0 / 0
инвалидация views при удалении уникального индекса
    #40106768
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Anokhin,

А вот обратная ситуация проходит корректно.
Если мы создаем уникальный индекс после view, oracle не инвалидирует view, а проверяет updatable во время самого update.
При этом представление user_updatable_columns также не обновляется, столбцы реально updatable, а там все еще NO .
И я не вижу, что мешает сделать такое же поведение при удалении индексов.


Код: 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.
drop table t1;
drop table t2;

create table t1 ( x number );
create table t2 ( y number );

create or replace view v
as
select *
  from t1,
       t2
where t1.x = t2.y;

select column_name,
       updatable,
       insertable,
       deletable
  from user_updatable_columns
 where table_name = 'V';

select status from dba_objects where object_name = 'V'; -->VALID

update v set y = 0; -->ORA-01779

create unique index i1 on t1(x);

select status from dba_objects where object_name = 'V'; -->VALID

update v set y = 0; --> OK

select column_name,
       updatable,
       insertable,
       deletable
  from user_updatable_columns
 where table_name = 'V';
...
Рейтинг: 0 / 0
инвалидация views при удалении уникального индекса
    #40106932
KoTTT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще чуть по теме:
YouTube Video
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / инвалидация views при удалении уникального индекса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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