我想让约束推迟,所以我写了这段代码:
alter table life_cycle_phases modify constraint SOME_T_NAME_UNIQUE INITIALLY DEFERRED DEFERRABLE;
但是orace返回错误:
00933. 00000 - "SQL command not properly ended"
我做错了什么?
更新:
好吧,我知道,一旦我创造了不可延迟的约束,我就无法检查它的状态,但我需要!
我的问题是:我需要禁用所有约束,在表中添加行,这是随机选择的(实际上我不知道将在哪个表中插入行)然后启用所有约束。enable novalidate
不会#39;工作,它验证行,延迟也不起作用,应该怎么做?
答案 0 :(得分:1)
通常,MODIFY
约束只是改变它的状态。例如,启用它,禁用它..
来自docs ..您无法将NOT DEFERRABLE
约束的状态更改为INITIALLY DEFERRED
。
修改约束的限制修改约束是 受以下限制:
•您无法将NOT DEFERRABLE约束的状态更改为 最初推迟。
•如果为索引组织表指定此子句,那么您 不能在同一陈述中指定任何其他条款。
•您无法更改外键列上的NOT NULL约束 一个引用分区表,你不能改变一个状态 分区引用分区表的引用约束。
因此,首先删除约束并重新创建它。 您可以使用以下方法生成约束的DDL。
DBMS_METADATA.GET_DDL('CONSTRAINT',CONSTRAINT_NAME,OWNER)
或试试这个......(礼貌:https://gist.github.com/sdeming/869717 ......我还没有测试!!)
select 'alter table ' || source_table || ' add constraint ' || constraint_name || ' foreign key (' || con_columns || ') references ' || target_table || ' (' || ind_columns || ') enable' data
from (select constraint_name, source_table, target_index, target_table, con_columns, wm_concat(column_name) ind_columns
from (select a.constraint_name, a.source_table, a.target_index, b.table_name target_table, a.con_columns, b.column_name, b.column_position
from (select a.constraint_name, a.source_table, a.target_index, wm_concat(a.column_name) con_columns
from (select a.constraint_name,
a.table_name source_table,
a.r_constraint_name target_index,
b.column_name,
b.position
from user_constraints a
inner join user_cons_columns b on (b.constraint_name = a.constraint_name)
where a.constraint_type = 'R'
and a.constraint_name = 'LIFE_CYCLE_PHASES_NAME_UNIQUE'
order by a.constraint_name, b.position) a
group by constraint_name, source_table, target_index) a
inner join user_ind_columns b on (b.index_name = a.target_index)
order by constraint_name, b.column_position)
group by constraint_name, source_table, target_index, target_table, con_columns);
然后DROP它,
alter table OWNER.life_cycle_phases drop constraint LIFE_CYCLE_PHASES_NAME_UNIQUE ;
最后仅使用生成的DDL重新创建约束。