pl / sql无法修改约束变量

问题描述 投票:1回答:1

我想使约束可推迟,所以我写了这段代码:

alter table life_cycle_phases modify constraint SOME_T_NAME_UNIQUE INITIALLY DEFERRED DEFERRABLE;

但是orace返回错误:

00933. 00000 -  "SQL command not properly ended"

我在做什么错?

更新:好的,我知道,一旦创建了不可延迟的约束,就无法检查其状态,但是我需要!我的问题是:我需要禁用所有约束,在表中添加行,这是随机选择的(实际上我不知道要在哪张表中插入行)然后启用所有约束。enable novalidate不起作用,它验证行,可推迟也行不通,应该怎么办?

oracle plsql constraints
1个回答
2
投票

[通常,MODIFY约束是仅更改其状态。例如,启用它,禁用它。

docs开始。您不能将NOT DEFERRABLE约束的状态更改为INITIALLY DEFERRED

修改约束的限制修改约束为受以下限制:

•您不能将NOT DEFERRABLE约束的状态更改为最初延迟。

•如果您为索引组织的表指定此子句,则您不能在同一条语句中指定任何其他子句。

•您不能更改的外键列上的NOT NULL约束参照分区表,您无法更改状态参考分区表的分区参考约束。

因此,请首先删除约束并重新创建它。您可以使用以下内容生成约束的DDL。

--For referential integrity constraints.
DBMS_METADATA.GET_DDL('REF_CONSTRAINT',CONSTRAINT_NAME,OWNER)
--For other kinds of constraints.
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);

然后删除它,

alter table OWNER.life_cycle_phases drop constraint LIFE_CYCLE_PHASES_NAME_UNIQUE ;

最后仅使用生成的DDL重新创建约束。

© www.soinside.com 2019 - 2024. All rights reserved.