1. 程式人生 > >OCP-1Z0-052-V8 02-170題

OCP-1Z0-052-V8 02-170題

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

170. A constraint in a table is defined with the INITIALLY IMMEDIATE clause. You executed the ALTER

TABLE command with the ENABLE VALIDATE option to enable the constraint that was disabled.

What are the two effects of this command? (Choose two.)

A.It fails if any existing row violates the constraint.

B.It does not validate the existing data in the table.新舊資料必須同時滿足約束規則

C.It enables the constraint to be enforced at the end of each transaction. INITIALLY IMMEDIATE 立即執行約束,並不是在事務結束時生效

D.It prevents insert, update, and delete operations on the table while the constraint is in the process ofbeing enabled.

Answer: AD

約束狀態--約束一共有四種狀態

a、enable validate-要求新舊資料必須同時滿足約束規則-在規則正在進行中時是不容許在表上進行任何 DML

操作的

b、enable novalidate-已存在資料可以不滿足,但是新資料必須滿足

c、disable validate-不容許在表上進行任何 DML 操作,對主鍵和唯一約束來說,會刪除相應的唯一索引,但

約束規則仍然有效

d、disable novalidate-資料不滿足約束規則,對主鍵和唯一約束來說,會刪除相應的唯一索引

INITIALLY IMMEDIATE 初始化立即執行--在每條語句執行結束時檢驗約束

INITALLY DEFERRED 初始化延遲執行,一直等到事務完成後(或者呼叫 set constraint immediate 語句時)才檢驗約束

SQL> create table t( x int constraint check_x check ( x > 0 ) deferrable initially immediate,

y int constraint check_y check ( y > 0 ) deferrable initially deferred )

SQL> insert into t values ( -1,1);

insert into t values ( -1,1);0ERROR at line 1: ORA-02290: checkconstraint (OPS$TKYTE.CHECK_X) violated

由於 CHECK_X 是可延遲但初始化為立即執行的約束,所以這一行立刻被拒絕了。而 CHECK_Y 則不同,它不僅是可延遲的,而且初

始化為延遲執行,這就意味著直到我用 COMMIT 命令提交事務或將約束狀態設定為立即執行時才檢驗約束。

SQL> insert into t values ( 1,-1);

現在它是成功的(總之到目前為止是成功的)。我將約束檢驗延遲到了執行 COMMIT 的時候:

SQL> commit;

0ERROR at line 1: ORA-02091: transaction rolled back

ORA-02290: check constraint (OPS$TKYTE.CHECK_Y) violated

此時資料庫將事務回滾,因為違反約束導致了COMMIT語句的失敗。

這些語句說明了初始化立即執行與初始化延遲執行約束之間的區別。

initially(初始化)部分指定Oracle什麼時候會進行預設的約束檢驗--是在語句結束時[immediate(立即執行)],

還是在事務結束時[deferred(延遲執行)]。

還要說明deferred(可延遲)子句有什麼用。

我可以發出命令,讓所有可延遲的約束變為延遲執行的。

注意,你也可以對一個約束使用該命令,你不必讓所有可延遲的約束都變為延遲執行的:

SQL>set constraints all deferred; 或者 SQL> set constraints allimmediate;

延遲約束有哪些實際用處呢? 有很多。

它主要用於物化檢視(快照)。這些檢視會使用延遲約束來進行檢視重新整理。

在重新整理物化檢視的過程中,可能會破壞完整性,而且將不能逐句檢驗約束。

但到執行 COMMIT 時,資料完整性就沒問題了,而且能滿足約束。

沒有延遲約束,物化檢視的約束可能會使重新整理過程不能成功進行。

使用延遲約束的另一個普遍原因是,當預測是否需要更新父/子關係中的主鍵時,它有助於級聯更新。

如果你將外來鍵設為可延遲、但初始化為立即執行,那麼你就可以將所有約束設定為可延遲。

將父鍵更新為一個新值--至此子關係的完整性約束不會被驗證。將子外來鍵更新為這個新值。

COMMIT--只要所有受更新影響的子記錄都指向現有的父記錄,這條命令就能成功執行。

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述