2011-11-12 14 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は完全ではありません。実際にはないという賭けがあると考えることに騙されてしまう状況があります。適切な場所に列を持つ複数の異なるインデックスがそれを欺くことができます。適切に行うには、インライン・ビューでグループ化を開始するか、分析関数を使用して、すべての索引列が同じ索引から来るようにする必要があります。だから私はほとんどの時間で動作するこの単純なバージョンでそれを残しました。

次に、このSQLをsqlplusで実行するか、コマンドラインから簡単に実行できるシェルスクリプトに埋め込むことができます。粗製物1は次のようになります。あなたは、このように実行し、基本的な結果を得ることができます

#!/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 

希望します。

関連する問題