Неиндексированные внешние ключи

Я ищу команду командной строки, которая будет отображать ту же самую вещь, что и gui

Unindexed Foreign Keys 
1

2 ответы

Нет команды командной строки (которой я знаю), которая это делает. Но вы можете бросить свои собственные. В основном вам нужен запрос, который проверяет базу данных для них, что эффективно, что ваш инструмент графического интерфейса должен делать. Запрос будет выглядеть примерно так:

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, источник

Ниже приведен сценарий, который должен работать правильно каждый раз, любезно предоставленный Стивом Адамсом:

-------------------------------------------------------------------------------
--
-- 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
добавлено
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)

Oracle RU
Oracle RU
303 участник(ов)

Русскоязычная группа по Oracle. — Архитектура СУБД — PL/SQL — Оптимизация — Администрирование — Вакансии Oracle (указать инфу по вилке ЗП и удалёнке) Приглашайте коллег :-) Запрещены: личные оскорбления, обсуждения оффтопик вопросов политики и религии