索引付けされていない外部キー

私はguiと同じものを表示するコマンドラインコマンドを探しています

Unindexed Foreign Keys 
1
追加された
ビュー: 1

2 答え

コマンドラインコマンド(私が知っている)はありません。しかし、あなた自身をロールバックすることができます。基本的に、これらのデータベースをチェックするクエリが必要です。これは、効果的に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で実行するか、コマンドラインから簡単に実行できるシェルスクリプトに埋め込むことができます。原油は次のようになります:

#!/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
4
追加された
これは私がGUIに固執するものです。
追加された 著者 randy white,

以下は、Steve Adamsの礼儀正しく、毎回正しく動作するスクリプトです:

-------------------------------------------------------------------------------
--
-- 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

希望が役立ちます。

3
追加された