2011-11-12 57 views

回答

4

沒有命令行命令(據我所知),該做的。但你可以推出自己的。基本上你需要一個查詢來檢查這些數據庫,這實際上是你的GUI工具必須做的。該查詢將類似於:

SELECT FK.table_name, FK.constraint_name 
FROM user_constraints FK 
WHERE FK.constraint_type = 'R' 
AND  EXISTS 
     ( SELECT FC.position, FC.column_name 
      FROM user_cons_columns FC 
      WHERE FC.constraint_name = FK.constraint_name 
      MINUS 
      SELECT IC.column_position AS position, IC.column_name 
      FROM user_ind_columns IC 
      WHERE IC.table_name = FK.table_name 
     ) 

注意:此SQL不完美。可能會出現這種情況,因爲有人認爲索引下注並不是真的。多個不同的索引與列在正確的地方可以欺騙它。要正確地做到這一點,您需要開始將內聯視圖分組或使用分析函數來確保所有索引列來自同一索引。所以我把它放在這個簡單的版本上,這個版本大部分時間都是可用的。

然後你可以在sqlplus中運行這個SQL,或者你可以將它嵌入到一個可以很容易地從命令行運行的shell腳本中。粗之一將是:

#!/bin/bash -ue 

LOGIN="$1" 
sqlplus -s << END_SQL 
    $LOGIN 
    SET PAGESIZE 5000 
    SELECT FK.table_name, FK.constraint_name 
    FROM user_constraints FK 
    WHERE FK.constraint_type = 'R' 
    AND  EXISTS 
      ( SELECT FC.position, FC.column_name 
       FROM user_cons_columns FC 
       WHERE FC.constraint_name = FK.constraint_name 
       MINUS 
       SELECT IC.column_position AS position, IC.column_name 
       FROM user_ind_columns IC 
       WHERE IC.table_name = FK.table_name 
      ) 
/
END_SQL 

然後你就可以像這樣運行,並得到了基本結果:

[[email protected] sql]$ ./fk.sh scott/[email protected] 

TABLE_NAME      CONSTRAINT_NAME 
------------------------------ ------------------------------ 
EMP       FK_DEPTNO 
+0

這是我將堅持GUI。 –

3

下面是一個腳本,應該正確每次上班,史蒂夫·亞當斯的禮遇:

------------------------------------------------------------------------------- 
-- 
-- Script: missing_fk_indexes.sql 
-- Purpose: to check for locking problems with missing foriegn key indexes 
-- For:  8.1 and higher 
-- 
-- Copyright: (c) Ixora Pty Ltd 
-- Author: Steve Adams 
-- 
------------------------------------------------------------------------------- 
@save_sqlplus_settings 

column constraint_name noprint 
column table_name format a48 
break on constraint_name skip 1 on table_name 

select /*+ ordered */ 
    n.name constraint_name, 
    u.name ||'.'|| o.name table_name, 
    c.name column_name 
from 
    (
    select /*+ ordered */ distinct 
     cd.con#, 
     cd.obj# 
    from 
     sys.cdef$ cd, 
     sys.tab$ t 
    where 
     cd.type# = 4 and   -- foriegn key 
     t.obj# = cd.robj# and 
     bitand(t.flags, 6) = 0 and -- table locks enabled 
     not exists (   -- not indexed 
    select 
     null 
    from 
     sys.ccol$ cc, 
      sys.ind$ i, 
     sys.icol$ ic 
    where 
      cc.con# = cd.con# and 
      i.bo# = cc.obj# and 
      bitand(i.flags, 1049) = 0 and  -- index must be valid 
      ic.obj# = i.obj# and 
     ic.intcol# = cc.intcol# 
     group by 
      i.obj# 
     having 
      sum(ic.pos#) = (cd.cols * cd.cols + cd.cols)/2 
    ) 
) fk, 
    sys.obj$ o, 
    sys.user$ u, 
    sys.ccol$ cc, 
    sys.col$ c, 
    sys.con$ n 
where 
    o.obj# = fk.obj# and 
    o.owner# != 0 and   -- ignore SYS 
    u.user# = o.owner# and 
    cc.con# = fk.con# and 
    c.obj# = cc.obj# and 
    c.intcol# = cc.intcol# and 
    n.con# = fk.con# 
order by 
    2, 1, 3 
/

@restore_sqlplus_settings 

希望有所幫助。