OCP-1Z0-052-V8.02-170题

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 of being 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--只要所有受更新影响的子记录都指向现有的父记录,这条命令就能成功执行。

原文地址:https://www.cnblogs.com/hzcya1995/p/13317155.html