- --此脚本适用于Oracle 10g
- SELECT 'ALTER TABLE ' || T1_OWNER || '.' || T1_TABLE_NAME
- || ' ADD CONSTRAINT ' || T1_CONSTRAINT_NAME
- || ' FOREIGN KEY (' || T1_COLUMN_NAMES || ')'
- || ' REFERENCES ' || T2_OWNER || '.' || T2_TABLE_NAME
- || '(' || T2_COLUMN_NAMES || ');' FK_SCRIPT
- FROM
- (SELECT A.OWNER T1_OWNER
- , A.TABLE_NAME T1_TABLE_NAME
- , A.CONSTRAINT_NAME T1_CONSTRAINT_NAME
- , B.R_CONSTRAINT_NAME T2_CONSTRAINT_NAME
- -- CONCATENATE COLUMNS TO HANDLE COMPOSITE
- -- FOREIGN KEYS [HANDLES UP TO 5 COLUMNS]
- , MAX(DECODE(A.POSITION, 1,
- A.COLUMN_NAME,NULL)) ||
- MAX(DECODE(A.POSITION, 2,', '||
- A.COLUMN_NAME,NULL)) ||
- MAX(DECODE(A.POSITION, 3,', '||
- A.COLUMN_NAME,NULL)) ||
- MAX(DECODE(A.POSITION, 4,', '||
- A.COLUMN_NAME,NULL)) ||
- MAX(DECODE(A.POSITION, 5,', '||
- A.COLUMN_NAME,NULL))
- T1_COLUMN_NAMES
- FROM DBA_CONS_COLUMNS A
- , DBA_CONSTRAINTS B
- WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
- AND B.CONSTRAINT_TYPE = 'R'
- GROUP BY A.OWNER
- , A.TABLE_NAME
- , A.CONSTRAINT_NAME
- , B.R_CONSTRAINT_NAME
- ) T1,
- (SELECT A.OWNER T2_OWNER
- , A.CONSTRAINT_NAME T2_CONSTRAINT_NAME
- , A.TABLE_NAME T2_TABLE_NAME
- -- CONCATENATE COLUMNS FOR PK/UK REFERENCED
- -- FROM A COMPOSITE FOREIGN KEY
- , MAX(DECODE(A.POSITION, 1,
- A.COLUMN_NAME,NULL)) ||
- MAX(DECODE(A.POSITION, 2,', '||
- A.COLUMN_NAME,NULL)) ||
- MAX(DECODE(A.POSITION, 3,', '||
- A.COLUMN_NAME,NULL)) ||
- MAX(DECODE(A.POSITION, 4,', '||
- A.COLUMN_NAME,NULL)) ||
- MAX(DECODE(A.POSITION, 5,', '||
- A.COLUMN_NAME,NULL))
- T2_COLUMN_NAMES
- FROM DBA_CONS_COLUMNS A, DBA_CONSTRAINTS B
- WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
- AND B.CONSTRAINT_TYPE IN ( 'P', 'U' )
- GROUP BY A.OWNER
- , A.TABLE_NAME
- , A.CONSTRAINT_NAME ) T2
- WHERE T1.T1_OWNER = T2.T2_OWNER
- AND T1.T2_CONSTRAINT_NAME = T2.T2_CONSTRAINT_NAME
- AND T2.T2_OWNER ='&OWNER'
- AND T2.T2_TABLE_NAME = '&TABLE_NAME';