啟用約束時使用exceptions表來跟蹤不符合約束的資料並修正

eric0435發表於2012-03-04
啟用約束時使用exceptions表來跟蹤不符合約束的資料並修正
使用 EXCEPTIONS 表
1. 建立 EXCEPTIONS 表 (utlexcpt.sql)
2. 使用 EXCEPTIONS 子句執行 ALTER TABLE
3. 使用 EXCEPTIONS 子查詢查詢包含無效資料的行
4. 糾正錯誤
5. 再次執行 ALTER TABLE 以啟用約束

如何識別行違反
EXCEPTIONS 子句幫助識別任何違反已啟用的約束的行按下列步驟檢測違反
約束的行為糾正它們並重新啟用約束
1 如果還未建立請在管理目錄中執行 utlexcpt.sql 指令碼以建立異常表
SQL> @?/rdbms/admin/utlexcpt
Statement processed.
SQL> DESCRIBE exceptions
Name Null?Type
-------------------------- ------- ----------------
ROW_ID UNDEFINED
OWNER VARCHAR2(30)
TABLE_NAME VARCHAR2(30)
CONSTRAINT VARCHAR2(30)
在 Windows NT 中該指令碼位於
%ORACLE_HOME%\RDBMS\ADMIN 目錄下
2 使用 EXCEPTIONS 子句執行 ALTER TABLE 命令
SQL> ALTER TABLE summit.employee
2 ENABLE VALIDATE CONSTRAINT employee_dept_id_fk
3 EXCEPTIONS INTO system.exceptions;
ALTER TABLE summit.employee
*
ORA-02298:cannot enable (summit.EMP_DEPT_FK) - parent keys not
found
如果 EXCEPTIONS 表未用所有者姓名限定則它必須屬於正改變
的表的所有者
將行插入 EXCEPTIONS 表中如果重新執行該命令將截斷
EXCEPTIONS 表以刪除全部現有的行
3 使用 EXCEPTIONS 表上的子查詢標識無效資料
SQL> SELECT rowid, id, last_name, dept_id
2 FROM summit.employee
3 WHERE ROWID in (SELECT row_id
4 FROM exceptions)
5 FOR UPDATE;
ROWID ID LAST_NAME DEPT_ID
------------------- ----- --------------- --------
AAAAeyAADAAAAA1AAA 1003 Pirie 50
1 row selected.
4 更正資料中的錯誤
SQL> UPDATE summit.employee
2 SET id=10
3 WHERE rowid='AAAAeyAADAAAAA1AAA';
1 row processed.
SQL> COMMIT;
Statement processed.

5 截斷 EXCEPTIONS 表並重新啟用約束
SQL> TRUNCATE TABLE exceptions;
Statement processed.
SQL> ALTER TABLE summit.employee
2 ENABLE VALIDATE CONSTRAINT employee_dept_id_fk
3 EXCEPTIONS INTO system.exceptions;
Statement processed

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

相關文章