如何使用单个命令禁用Oracle中的所有表约束?

推荐答案

最好避免写出临时假脱机文件.使用PL/SQL块.您可以从SQL*Plus运行它,或者将它放入一个包或过程中.连接到用户_表是为了避免视图约束.

您不太可能真的想要禁用所有约束(包括NOTNULL、主键等).您应该考虑在WHERE子句中添加约束类型.

BEGIN
  FOR c IN
  (SELECT c.owner, c.table_name, c.constraint_name
   FROM user_constraints c, user_tables t
   WHERE c.table_name = t.table_name
   AND c.status = 'ENABLED'
   AND NOT (t.iot_type IS NOT NULL AND c.constraint_type = 'P')
   ORDER BY c.constraint_type DESC)
  LOOP
    dbms_utility.exec_ddl_statement('alter table "' || c.owner || '"."' || c.table_name || '" disable constraint ' || c.constraint_name);
  END LOOP;
END;
/

再次启用约束有点难——在外键约束中引用它们之前,需要启用主键约束.这可以通过使用"按约束类型排序"来完成P'=主键,R'=外键.

BEGIN
  FOR c IN
  (SELECT c.owner, c.table_name, c.constraint_name
   FROM user_constraints c, user_tables t
   WHERE c.table_name = t.table_name
   AND c.status = 'DISABLED'
   ORDER BY c.constraint_type)
  LOOP
    dbms_utility.exec_ddl_statement('alter table "' || c.owner || '"."' || c.table_name || '" enable constraint ' || c.constraint_name);
  END LOOP;
END;
/

Sql相关问答推荐

为主表中的每一行查找N个最新行

查询将查找将标记设置为user2的用户

在SQL中向每个子字节组添加字节行

基于模式或其他行集的数据复制

PostgreSQL:如果发现多行具有相似列值,则跳过 Select 行

当我们加入两个表时,我们可以省略GROUP BY中的列名吗?

Access VBA SQL命令INSERT FOR MULTIME VALUE

PostgreSQL抽奖查询

DBeaver将过程中的属性列表转换为字符串

在SQL Server中设置关联对象的有效JSON格式

SQL按日期分组字段和如果日期匹配则求和

数据库SQL PARSE_SYNTAX_ERROR

需要从键-值对数据中提取值

按两列分组,并根据SQL中的条件返回第三个列值

Select 组中的第一行,但在并发环境中

试图找到两个身份列表的交集(列表的长度不同),但获取列 id 不明确?

正则表达式忽略特定数据部分的分隔符

如果 SQL 中不存在数据,如何根据某个 ID 为所有日期添加前一行

以 15 分钟为间隔的使用情况SQL 查询

T-SQL - 返回每条记录的最近雇佣日期