Niet-geïnde externe sleutels

Ik ben op zoek naar de command line-opdracht die hetzelfde zal weergeven als de gui

Unindexed Foreign Keys 
1

2 antwoord

Er is geen opdrachtregelopdracht (die ik ken) die het doet. Maar u kunt uw eigen rollen. In principe heeft u een query nodig die de database hierop controleert, wat effectief is wat uw GUI-tool moet doen. De zoekopdracht zou iets zijn als:

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
        )

OPMERKING: deze SQL is NIET perfect. Er kunnen situaties zijn waarin het voor de gek gehouden wordt om te denken dat er een indexweddenschap is die niet echt bestaat. Meerdere verschillende indexen met kolommen op de juiste plaats kunnen het voor de gek houden. Om dit goed te doen, moet u beginnen met groeperen in inline views of analytische functies gebruiken om ervoor te zorgen dat alle indexkolommen uit dezelfde index komen. Dus liet ik het achter bij deze eenvoudige versie die het grootste deel van de tijd zal werken.

Vervolgens kunt u deze SQL in sqlplus uitvoeren, of u kunt deze in een shell-script insluiten dat eenvoudig vanaf de opdrachtregel kan worden uitgevoerd. Een ruwe zou zijn:

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

Welke je vervolgens als volgt kunt uitvoeren en de basisresultaten krijgt:

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

TABLE_NAME                     CONSTRAINT_NAME
------------------------------ ------------------------------
EMP                            FK_DEPTNO
4
toegevoegd
Dit is er een die ik blijf bij de GUI.
toegevoegd de auteur randy white, de bron

Het volgende is een script dat elke keer correct zou moeten werken, met dank aan 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

Ik hoop dat het helpt.

3
toegevoegd