Disable all table constraints in Oracle

后端 未结 11 973
耶瑟儿~
耶瑟儿~ 2020-11-28 18:35

How can I disable all table constrains in Oracle with a single command? This can be either for a single table, a list of tables, or for all tables.

11条回答
  •  旧时难觅i
    2020-11-28 19:03

    This is another way for disabling constraints (it came from https://asktom.oracle.com/pls/asktom/f?p=100:11:2402577774283132::::P11_QUESTION_ID:399218963817)

    WITH qry0 AS
           (SELECT    'ALTER TABLE '
                   || child_tname
                   || ' DISABLE CONSTRAINT '
                   || child_cons_name
                     disable_fk
                  ,   'ALTER TABLE '
                   || parent_tname
                   || ' DISABLE CONSTRAINT '
                   || parent.parent_cons_name
                     disable_pk
              FROM (SELECT a.table_name child_tname
                          ,a.constraint_name child_cons_name
                          ,b.r_constraint_name parent_cons_name
                          ,LISTAGG ( column_name, ',') WITHIN GROUP (ORDER BY position) child_columns
                      FROM user_cons_columns a
                          ,user_constraints b
                     WHERE a.constraint_name = b.constraint_name AND b.constraint_type = 'R'
                    GROUP BY a.table_name, a.constraint_name
                            ,b.r_constraint_name) child
                  ,(SELECT a.constraint_name parent_cons_name
                          ,a.table_name parent_tname
                          ,LISTAGG ( column_name, ',') WITHIN GROUP (ORDER BY position) parent_columns
                      FROM user_cons_columns a
                          ,user_constraints b
                     WHERE a.constraint_name = b.constraint_name AND b.constraint_type IN ('P', 'U')
                    GROUP BY a.table_name, a.constraint_name) parent
             WHERE child.parent_cons_name = parent.parent_cons_name
               AND (parent.parent_tname LIKE 'V2_%' OR child.child_tname LIKE 'V2_%'))
    SELECT DISTINCT disable_pk
      FROM qry0
    UNION
    SELECT DISTINCT disable_fk
      FROM qry0;
    

    works like a charm

提交回复
热议问题