首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 約束管理自動化腳本:外鍵與觸發器批量啟用停用、違規資料自動偵測

     編輯:Oracle 資料庫基礎

業務背景

銀行資料集中專案需合併各地分散的代碼表。合併前必須停用所有外鍵與觸發器,資料處理完畢後重新啟用。本文提供兩支 PL/SQL 腳本:

  1. 約束管理腳本:批量啟用/停用當前用戶下所有外鍵與觸發器
  2. 約束錯誤自動查找腳本:自動偵測導致 ORA-02298「找不到父鍵」的違規資料

腳本一:P_ALTERCONS(約束管理)

呼叫方式

SQL> SET SERVEROUTPUT ON;
SQL> ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';
SQL> EXEC P_ALTERCONS('ENABLE');  -- 或 'DISABLE'

參數僅接受 ENABLE 或 DISABLE,其它值報錯。

核心邏輯

  • 游標 C_CON 查詢 USER_CONSTRAINTS 中 CONSTRAINT_TYPE='R'(外鍵)
  • 游標 C_TRIGGER 查詢 USER_TRIGGERS
  • 動態 SQL (DBMS_SQL) 執行 ALTER TABLE ... ENABLE/DISABLE CONSTRAINT 及 ALTER TRIGGER ... ENABLE/DISABLE
  • 僅處理狀態需變更的物件,統計處理筆數並輸出
  • 捕捉例外:ORA-02298 時呼叫 P_CON_ERR 自動偵測違規資料

腳本二:P_CON_ERR(違規資料自動偵測)

單獨呼叫範例

SQL> EXEC P_CON_ERR('FK_SB_HJJL_RELATION__SB_PZXH');
外鍵錯誤情況
============
NSRNM,PZLXDM,PZXH
-----------------
190321058, 900, 13546
777777775, 108, 17526
...

核心邏輯

  1. 查詢 USER_CONS_COLUMNS 取得外鍵欄位清單,組合 WHERE 條件
  2. 查詢 USER_CONSTRAINTS 取得被參照表名(父表)
  3. 動態 SQL 執行:SELECT DISTINCT 外鍵欄位 FROM 子表 A WHERE NOT EXISTS (SELECT NULL FROM 父表 B WHERE A.欄位=B.欄位...)
  4. 輸出所有不滿足外鍵條件的資料值

兩支腳本完整原始碼已包含於原文,可直接部署使用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved