table 上与 Mview 同名的 DML
DML on table with the same name as Mview
出于某种原因,我应该保留与基础同名的 Mview table。
在这种情况下,您能告诉我如何在基础 table 上发布 DML 吗?
正如您在下面的示例中看到的,我想为基础 table 发布 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
TGT_TABLE
是一个物理的 table,被物化视图用作 "storage"
SRC_TABLE
是一个 table,用作实体化视图 的 "source" 数据
- 你
- 无法修改实体化视图或用作其存储的底层table
- 可以修改用作源的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>
但是,您选择重新使用现有的 table(TGT_TABLE
;它是 ON PREBUILT TABLE
子句)所以看起来好像有两个同名的对象。这就是物化视图的设计方式 - 具有 "query"(用于刷新数据的 "view")和实际包含数据的 "physical storage"("table")。
如果您没有使用已经存在的 table 并在某些 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
看到了吗?否则 不可能 实现的东西。
您所做的是尝试修改 存储 table,但没有成功:
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
但是,您可以/应该修改 table 实体化视图的创建依据:
SQL> update dept set loc = 'Zagreb' where deptno = 10;
1 row updated.
SQL>
无论如何,修改存储 table 没有多大意义,因为这些更改将在下一次实体化视图刷新时被覆盖。
因此,在您的情况下,您应该 update/delete SRC_TABLE
,而不是 TRG_TABLE
。
出于某种原因,我应该保留与基础同名的 Mview table。 在这种情况下,您能告诉我如何在基础 table 上发布 DML 吗? 正如您在下面的示例中看到的,我想为基础 table 发布 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
TGT_TABLE
是一个物理的 table,被物化视图用作 "storage"SRC_TABLE
是一个 table,用作实体化视图 的 "source" 数据
- 你
- 无法修改实体化视图或用作其存储的底层table
- 可以修改用作源的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>
但是,您选择重新使用现有的 table(TGT_TABLE
;它是 ON PREBUILT TABLE
子句)所以看起来好像有两个同名的对象。这就是物化视图的设计方式 - 具有 "query"(用于刷新数据的 "view")和实际包含数据的 "physical storage"("table")。
如果您没有使用已经存在的 table 并在某些 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
看到了吗?否则 不可能 实现的东西。
您所做的是尝试修改 存储 table,但没有成功:
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
但是,您可以/应该修改 table 实体化视图的创建依据:
SQL> update dept set loc = 'Zagreb' where deptno = 10;
1 row updated.
SQL>
无论如何,修改存储 table 没有多大意义,因为这些更改将在下一次实体化视图刷新时被覆盖。
因此,在您的情况下,您应该 update/delete SRC_TABLE
,而不是 TRG_TABLE
。