web-dev-qa-db-ja.com

これらの壊れた同義語をどのように修正できますか?

次のクエリを実行すると:

SELECT S.OWNER   AS SYN_OWNER,
  S.SYNONYM_NAME AS SYN_NAME,
  S.TABLE_OWNER  AS OBJ_OWNER,
  S.TABLE_NAME   AS OBJ_NAME,
  CASE
    WHEN O.OWNER IS NULL
    THEN 'MISSING'
    ELSE O.STATUS
  END AS OBJ_STATUS
FROM DBA_SYNONYMS S
LEFT JOIN DBA_OBJECTS O
ON S.TABLE_OWNER = O.OWNER
AND S.TABLE_NAME = O.OBJECT_NAME
WHERE O.OWNER   IS NULL
OR O.STATUS     != 'VALID';

それは私に次の出力を与えます:

PUBLIC  GV$LOADPSTAT    SYSTEM  GV_$LOADPSTAT   INVALID
PUBLIC  GV$LOADISTAT    SYSTEM  GV_$LOADISTAT   INVALID
PUBLIC  V$LOADPSTAT SYSTEM  V_$LOADPSTAT    INVALID
PUBLIC  V$LOADISTAT SYSTEM  V_$LOADISTAT    INVALID
PUBLIC  LOADER_CONSTRAINT_INFO  SYSTEM  LOADER_CONSTRAINT_INFO  MISSING
PUBLIC  LOADER_COL_INFO SYSTEM  LOADER_COL_INFO MISSING
PUBLIC  GV$DB_TRANSPORTABLE_PLATFORM    SYS GV$_DB_TRANSPORTABLE_PLATFORM   MISSING
PUBLIC  LOADER_COL_TYPE SYSTEM  LOADER_COL_TYPE MISSING
PUBLIC  LOADER_OID_INFO SYSTEM  LOADER_OID_INFO MISSING
PUBLIC  LOADER_PARAM_INFO   SYSTEM  LOADER_PARAM_INFO   MISSING
PUBLIC  LOADER_FULL_ATTR_NAME   SYSTEM  LOADER_FULL_ATTR_NAME   MISSING
PUBLIC  LOADER_INTCOL_INFO  SYSTEM  LOADER_INTCOL_INFO  MISSING
PUBLIC  LOADER_NESTED_VARRAYS   SYSTEM  LOADER_NESTED_VARRAYS   MISSING
PUBLIC  LOADER_LOB_FLAGS    SYSTEM  LOADER_LOB_FLAGS    MISSING
PUBLIC  LOADER_DIR_OBJS SYSTEM  LOADER_DIR_OBJS MISSING
PUBLIC  GV$SYSTEM_FIX_CONTROL   SYS GV$SYSTEM_FIX_CONTROL   MISSING
PUBLIC  LOADER_PART_INFO    SYSTEM  LOADER_PART_INFO    MISSING
PUBLIC  LOADER_COL_FLAGS    SYSTEM  LOADER_COL_FLAGS    MISSING
SYS DEF$_SCHEDULE   SYSTEM  DEF$_SCHEDULE   MISSING
PUBLIC  GV$TRANSPORTABLE_PLATFORM   SYS GV$_TRANSPORTABLE_PLATFORM  MISSING
PUBLIC  LOADER_TRIGGER_INFO SYSTEM  LOADER_TRIGGER_INFO MISSING
PUBLIC  LOADER_TAB_INFO SYSTEM  LOADER_TAB_INFO MISSING

これらを再コンパイルまたはドロップしようとすると:

ALTER PUBLIC SYNONYM GV_$LOADPSTAT COMPILE;

それは言う:

 SQLエラー:ORA-01031:権限が不十分です
 01031。 00000-"権限が不十分" 

これはどうしてでしょうか?私はSYSTEMとしてログインしています。

落とそうとすると:

DROP PUBLIC SYNONYM GV_$LOADPSTAT;

それは言う:

 SQLエラー:ORA-01432:削除するパブリックシノニムが存在しません
 01432 00000-"削除するパブリックシノニムは存在しません" 

クエリ結果がそれを示している場合、それはどのように存在できないのですか?

1
Kshitiz Sharma

まず、DBA_SYNONYMS.SYNONYM_NAMEはシノニムの名前です。 DBA_SYNONYMS.TABLE_NAMEは、シノニムが指すオブジェクトの名前です。クエリでは、INVALIDは同義語ではなく、それが指すオブジェクトです。修正する必要があるのは同義語ではなく、オブジェクトです。

これらを再コンパイルまたはドロップしようとすると:

ALTER PUBLIC SYNONYM GV_$LOADPSTAT COMPILE;

それは言う:

SQL Error: ORA-01031: insufficient privileges

01031. 00000 - "insufficient privileges"

これはどうしてでしょうか?私はSYSTEMとしてログインしています。

それはあなたのバージョンのバグです。

落とそうとすると:

DROP PUBLIC SYNONYM GV_$LOADPSTAT; It says:

SQL Error: ORA-01432: public synonym to be dropped does not exist

01432. 00000 - "public synonym to be dropped does not exist"

クエリ結果がそれを示している場合、それはどのように存在できないのですか?

次に、シノニムの名前はGV$LOADPSTAT。ここにオブジェクト(ビュー)をドロップしようとしています:GV_$LOADPSTAT。そして、そのビューはSYSTEMではなくSYSが所有しています。

MISSINGが表示されている場所では、同義語は存在しないオブジェクトを指しています。オブジェクトを置き換えるか、シノニムを削除してください。

1
Balazs Papp