Oracle

在Oracle DB中查詢不滿足表中約束的數據

  • January 21, 2020

在 Oracle 中,我在給定模式中有很多表。架構中的某些表約束已被禁用。

我必須知道給定模式中的所有表,其中任何約束都已停用,哪些(數據)行不能滿足停用的約束。

問題

如果我決定再次啟用約束,有沒有辦法輕鬆收集所有會產生錯誤的行?

到目前為止,我會嘗試逐個約束,為每個表創建一個查詢並執行該查詢。但我想知道是否有任何東西可以快速完成工作並且不易出錯。如果可能,解決方案應使用視圖中可用的資訊USER_CONSTRAINTS或任何類似資訊。

我已經檢查了constraintOracle 中的文件,其中該constraint子句可能使用ENABLE NOVALIDATE,它允許在修改現有值之前擁有不合規的數據行。

但是,我正在尋找一種解決方案,允許我在重新啟用約束之前修復數據。

報告約束異常

在啟用約束之前,您必須創建一個適當的異常報告表以接受來自 ENABLE 子句的 EXCEPTIONS 選項的資訊。您可以通過執行 UTLEXCPT.SQL 腳本或 UTLEXPT1.SQL 腳本來創建異常表。

以下語句嘗試驗證 dept 表的 PRIMARY KEY,如果存在異常,則將資訊插入到名為 EXCEPTIONS 的表中:

ALTER TABLE dept ENABLE PRIMARY KEY EXCEPTIONS INTO EXCEPTIONS;

如果 dept 表中存在重複的主鍵值,並且 dept 上的 PRIMARY KEY 約束的名稱是 sys_c00610,則以下查詢將顯示這些異常:

SELECT * FROM EXCEPTIONS;

顯示以下異常:

fROWID               OWNER      TABLE_NAME      CONSTRAINT
------------------  ---------  --------------  -----------
AAAAZ9AABAAABvqAAB  SCOTT      DEPT            SYS_C00610 
AAAAZ9AABAAABvqAAG  SCOTT      DEPT            SYS_C00610

引用自:https://dba.stackexchange.com/questions/257840