DML на столе с тем же именем, что и Mview - PullRequest
0 голосов
/ 30 апреля 2020

По какой-то причине я должен оставить Mview с тем же именем, что и базовая таблица. Можете ли вы дать мне знать, как выпускать DML для базовой таблицы в этом случае? Как вы можете видеть из приведенного ниже примера, я хотел выпустить DML для базовой таблицы, однако Mview считается первым.

DROP TABLE SRC_TABLE PURGE;
DROP TABLE TGT_TABLE PURGE;
DROP MATERIALIZED VIEW TGT_TABLE;
DROP MATERIALIZED VIEW LOG ON SRC_TABLE ;

CREATE TABLE SRC_TABLE(X NUMBER(8) PRIMARY KEY);
CREATE TABLE TGT_TABLE(X NUMBER(8) PRIMARY KEY);

INSERT INTO SRC_TABLE VALUES(55);
COMMIT;


CREATE MATERIALIZED VIEW LOG ON SRC_TABLE WITH PRIMARY KEY, ROWID;


CREATE MATERIALIZED VIEW TGT_TABLE 
ON PREBUILT TABLE WITH REDUCED PRECISION
USING INDEX
REFRESH FAST ON DEMAND
WITH PRIMARY KEY USING DEFAULT LOCAL ROLLBACK SEGMENT
USING ENFORCED CONSTRAINTS DISABLE ON QUERY COMPUTATION DISABLE QUERY REWRITE
AS 
SELECT * FROM SRC_TABLE
/

INSERT INTO SRC_TABLE VALUES (10);
INSERT INTO SRC_TABLE VALUES (20);
COMMIT;


EXEC DBMS_MVIEW.REFRESH('TGT_TABLE');

SELECT * FROM SRC_TABLE;
SELECT * FROM TGT_TABLE;


SQL> DELETE FROM TGT_TABLE;
DELETE FROM TGT_TABLE
            *
ERROR at line 1:
ORA-01732: data manipulation operation not legal on this view

1 Ответ

2 голосов
/ 30 апреля 2020
  • TGT_TABLE - это физическая таблица, которая используется материализованным представлением в качестве «хранилища»
  • SRC_TABLE - это таблица, которая используется в качестве «источника» данных для этой материализованной представление
  • вы
    • не можете изменить материализованное представление или базовую таблицу, которая используется в качестве его хранилища
    • может изменить таблицу, которая используется в качестве источника, и это быть SRC_TABLE, а не TGT_TABLE

Это как бы сбивает с толку , потому что похоже, что у вас два объекта с одинаковым имя, которое невозможно . Например:

SQL> select object_name, object_type from user_objects where object_name = 'DEPT';

OBJECT_NAME     OBJECT_TYPE
--------------- -------------------
DEPT            TABLE

SQL> create materialized view dept as select * From dept;
create materialized view dept as select * From dept
                                               *
ERROR at line 1:
ORA-00955: name is already used by an existing object


SQL>

Однако вы решили повторно использовать существующую таблицу (TGT_TABLE; это предложение ON PREBUILT TABLE), чтобы выглядело, как будто два объекта с одинаковым именем. Вот как создается материализованное представление - имеет «запрос» («представление», которое используется для рефракции sh данных) и «физическое хранилище» («таблица»), которое фактически содержит данные.

Если Вы не использовали таблицу, которая уже существует, и создали материализованное представление для некоторой таблицы, вы все равно увидите два объекта с одинаковым именем. Например:

SQL> select object_name, object_type from user_objects where object_name = 'TEST';

no rows selected

SQL> create materialized view test as select * from dept;

Materialized view created.

SQL> select object_name, object_type from user_objects where object_name = 'TEST';

OBJECT_NAME     OBJECT_TYPE
--------------- -------------------
TEST            TABLE
TEST            MATERIALIZED VIEW

Видите? Что-то, что невозможно достичь иначе.

То, что вы делали, пыталось изменить таблицу storage , и это не сработало:

SQL> update test set loc = 'Zagreb' where deptno = 10;
update test set loc = 'Zagreb' where deptno = 10
       *
ERROR at line 1:
ORA-01732: data manipulation operation not legal on this view

Но вы можете / должны изменить созданное материализованное представление таблицы:

SQL> update dept set loc = 'Zagreb' where deptno = 10;

1 row updated.

SQL>

В любом случае, изменение таблицы хранения не имеет особого смысла, так как эти изменения будут перезаписаны при следующем материализованном представлении. refre sh.


Итак, в вашем случае вы должны обновить / удалить SRC_TABLE, а не TRG_TABLE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...