關於primary key和foreign key的問題處理

jeanron100發表於2013-06-04
今天碰到一個問題,在drop primary key的時候,提示ORA-02273的錯誤。
SQL> ALTER TABLE AR1_ACCOUNT DROP PRIMARY KEY;
ALTER TABLE AR1_ACCOUNT DROP PRIMARY KEY
*
ERROR at line 1:
ORA-02273: this unique/primary key is referenced by some foreign keys

透過下面的字典表查詢的關聯的表
SQL> SELECT con.constraint_name const_name, con.constraint_type const_type,
  2         con.table_name, con.search_condition search_cond,
  3         con.r_constraint_name r_const, col.table_name r_table,
       col.column_name r_column
  FROM user_constraints con, user_cons_columns col
 WHERE col.constraint_name = con.r_constraint_name  4    5    6  
  7  AND col.table_name='AR1_ACCOUNT';

CONST_NAME                     C TABLE_NAME                     SEARCH_COND          R_CONST                        R_TABLE                        R_COLUMN
------------------------------ - ------------------------------ -------------------- ------------------------------ ------------------------------ --------------------
AR3_GL_UNBILLED_REV_1FK        R AR3_GL_UNBILLED_REV                                 AR1_ACCOUNT_PK                 AR1_ACCOUNT                    ACCOUNT_ID

到此為止,我想為了保險起見,先把表AR3_GL_UNBILLED_REV的foreign key disable以後,再來drop這個表AR1_ACCOUNT   的primary key
使用alter table xxxx disable constraint xxxx;
執行成功了,但是drop primary key的時候還是提示錯誤 ORA-02273

沒辦法,看來disable不行,那隻能drop了,為了保險起見,先來spool一下建立constraint 的ddl 語句,但是呼叫時,又出現了問題。

 SQL> SELECT DBMS_METADATA.GET_DDL('CONSTRAINT','AR3_GL_UNBILLED_REV_1FK')FROM DUAL;
ERROR:
ORA-31603: object "AR3_GL_UNBILLED_REV_1FK" of type CONSTRAINT not found in
schema "TEST"
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 105
ORA-06512: at "SYS.DBMS_METADATA", line 3149
ORA-06512: at "SYS.DBMS_METADATA", line 4787
ORA-06512: at line 1

查詢網上所說,有的人說可能是許可權問題,賦予select_catalog_owner許可權就好了。但是很奇怪的,怎麼試都不行。
最後查了下大家的反饋,確定這是一個bug.這也是dbms_metadata的一個一個限制,在11g版本這個問題依然存在。
最後做了一個表的ddl,這樣就包含了foreign key的資訊

然後drop了foreign key的constraint之後,drop primary key的操作就可以了繼續了。
在指令碼最後,需要記得重建那個foreign key.

SQL> ALTER TABLE AR3_GL_UNBILLED_REV ADD CONSTRAINT AR3_GL_UNBILLED_REV_1FK FOREIGN KEY (ACCOUNT_ID) REFERENCES AR1_ACCOUNT(ACCOUNT_ID);

Table altered.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-762912/,如需轉載,請註明出處,否則將追究法律責任。

相關文章