与Mview同名的表上的DML

问题描述 投票:0回答:1

出于某种原因,我应该保留与基本表同名的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

oracle materialized-views
1个回答
0
投票
  • [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子句),因此看起来好像有两个同名对象。这就是实体化视图的设计方式-具有“查询”(用于刷新数据的“视图”)和实际上包含数据的“物理存储”(“表”)。

如果您不使用已经存在的表并在某个表上创建了物化视图,您仍然会看到两个具有相同名称的对象。例如:

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>

无论如何,修改存储表没有多大意义,因为这些更改将在下一次实例化视图刷新时被覆盖。


因此,在您的情况下,您应该更新/删除SRC_TABLE,而不是TRG_TABLE

© www.soinside.com 2019 - 2024. All rights reserved.