Oracle与Acce 表之间的导入和导出实现

文章作者 100test 发表时间 2007:09:06 14:04:54
来源 100Test.Com百考试题网


本文通过实例的方法来帮助您理解物化视图刷新过程中出现的约束冲突问题。

即使将物化视图的约束建立和基表完全一致,由于物化视图的刷新机制,也会产生约束冲突的现象。

一个简单的例子:


SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, NAME VARCHAR2(30)).--表已创建

SQL> ALTER TABLE T ADD CONSTRAINT UN_T_NAME UNIQUE (NAME).

--表已更改

SQL> CREATE MATERIALIZED VIEW LOG ON T.

--实体化视图日志已创建:

SQL> CREATE MATERIALIZED VIEW MV_T REFRESH FAST AS SELECT * FROM T.

--实体化视图已创建。

SQL> ALTER TABLE MV_T ADD CONSTRAINT UN_MV_T_NAME UNIQUE (NAME).

--表已更改:

SQL> INSERT INTO T VALUES (1, A).

--已创建 1 行:

SQL> INSERT INTO T VALUES (2, B).

--已创建 1 行:

SQL> COMMIT.

--提交完成:

SQL> EXEC DBMS_MVIEW.REFRESH(MV_T)

      --PL/SQL 过程已成功完成。

上面构造了一个简单的物化视图,物化视图和基表建立了相同的唯一约束。

下面进行一个循环的更新操作,然后观察刷新的情况:

SQL> UPDATE T SET NAME = C WHERE ID = 1.

--已更新 1 行。

SQL> UPDATE T SET NAME = A WHERE ID = 2.

--已更新 1 行。

SQL> UPDATE T SET NAME = B WHERE ID = 1.

--已更新 1 行。

SQL> COMMIT.

--提交完成。

SQL> EXEC DBMS_MVIEW.REFRESH(MV_T)

BEGIN DBMS_MVIEW.REFRESH(MV_T). END.

*

ERROR 位于第 1 行:

ORA-12008: 实体化视图的刷新路径中存在错误

ORA-00001: 违反唯一约束条件 (YANGTK.UN_MV_T_NAME)

ORA-06512: 在"SYS.DBMS_SNAPSHOT", line 794

ORA-06512: 在"SYS.DBMS_SNAPSHOT", line 851

ORA-06512: 在"SYS.DBMS_SNAPSHOT", line 832

      ORA-06512: 在line 1

刷新失败了。解决这个问题的一个方法是对于物化视图不建立唯一约束,唯一性由基表保证。但是这种方法只对只读物化视图适用。而且,缺少唯一约束信息,可能会影响SQL的执行计划。

这种情况下,最好的解决方法是建立延迟约束。

SQL> ALTER TABLE MV_T DROP CONSTRAINT UN_MV_T_NAME.

--表已更改。

SQL> ALTER TABLE MV_T ADD CONSTRAINT 

UN_MV_T_NAME UNIQUE (NAME) DEFERRABLE.

--表已更改。

SQL> EXEC DBMS_MVIEW.REFRESH(MV_T)

      --PL/SQL 过程已成功完成。

注意,延迟唯一约束对应的索引也必须是非唯一的,否则无法达到延迟约束的目的。



相关文章


新手入门:c 经典
MoreEffectiveC :防止资源泄漏
网络入侵四大主要途径对应策略保安全
据说是阿里巴巴公司DBA笔试题
Oracle与Acce 表之间的导入和导出实现
认识p-unit:一款开源的性能测试工
如何利用Java制作起始页面计数器
基于JDK5.0的一些Thread总结
Linux和Unix系统中的vi编译器使用入门
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛