Unindexed विदेशी कुंजी

मैं कमांड लाइन कमांड की तलाश में हूं जो गुई के समान ही प्रदर्शित करेगा

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
        )

नोट: यह एसक्यूएल सही नहीं है। ऐसी स्थितियां हो सकती हैं जहां यह सोचने में बेवकूफ हो कि वहां एक इंडेक्स शर्त है जो वास्तव में नहीं है। सही जगह पर कॉलम के साथ कई अलग-अलग इंडेक्स इसे मूर्ख बना सकते हैं। इसे सही तरीके से करने के लिए आपको इनलाइन विचारों में समूहांकन शुरू करना होगा या यह सुनिश्चित करने के लिए विश्लेषणात्मक कार्यों का उपयोग करना होगा कि सभी इंडेक्स कॉलम एक ही इंडेक्स से आते हैं। तो मैंने इसे इस सरल संस्करण पर छोड़ दिया जो ज्यादातर समय काम करेगा।

फिर आप एसक्यूएलप्लस में इस एसक्यूएल को चला सकते हैं, या आप इसे एक शेल स्क्रिप्ट में एम्बेड कर सकते हैं जो कमांड लाइन से आसानी से चलाया जा सकता है। एक कच्चा होगा:

#!/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
जोड़ा
यह एक है जिसे मैं जीयूआई के साथ रहूंगा।
जोड़ा लेखक 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
जोड़ा