从public回收SELECT ANY TABLE权限(或其他类似权限)将导致数据库中所有的procedure、function和package失效。
这时登陆数据库会报错:ORA-06553: PLS-213: STANDARD 包不可访问。
下面用一个例子说明怎么会产生这种情况,以及如何解决,感谢biti给出的思路--使用utlrp.sql脚本编译失效包。
当然从备份中恢复是最稳妥的方法,下面的方法只是没有备份,或无法停机的方法。另外还可以执行catalog.sql和catproc.sql重建数据字典,不过操作风险相对较大。
SQL> CONN YANGTK/YANGTK@TEST
已连接。
SQL> SELECT OBJECT_NAME FROM DBA_OBJECTS WHERE STATUS = 'INVALID';
未选定行
SQL> GRANT SELECT ANY TABLE TO PUBLIC;
授权成功。
SQL> REVOKE SELECT ANY TABLE TO PUBLIC;
REVOKE SELECT ANY TABLE TO PUBLIC
*
ERROR 位于第 1 行:
ORA-00905: 缺少关键字
SQL> REVOKE SELECT ANY TABLE FROM PUBLIC;
撤销成功。
SQL> SELECT OBJECT_NAME FROM DBA_OBJECTS WHERE STATUS = 'INVALID';
OBJECT_NAME
------------------------------------------------------------------
CLIENT_IP_ADDRESS
DATABASE_NAME
DBMSOBJG
DBMSOBJG2
DBMSOBJGWRAPPER
DBMSOBJG_DP
DBMSZEXP_SYSPKGGRNT
DBMS_ALERT
DBMS_APPCTX
DBMS_APPLICATION_INFO
DBMS_APPLY_ADM
DBMS_APPLY_ADM_INTERNAL
DBMS_APPLY_ERROR
DBMS_APPLY_PROCESS
DBMS_AQ
DBMS_AQADM
DBMS_AQADM_SYS
DBMS_AQADM_SYSCALLS
DBMS_AQELM
DBMS_AQIN
DBMS_AQJMS
DBMS_AQJMS_INTERNAL
DBMS_AQ_EXP_HISTORY_TABLES
DBMS_AQ_EXP_INDEX_TABLES
DBMS_AQ_EXP_QUEUES
DBMS_AQ_EXP_QUEUE_TABLES
DBMS_AQ_EXP_SIGNATURE_TABLES
DBMS_AQ_EXP_SUBSCRIBER_TABLES
DBMS_AQ_EXP_TIMEMGR_TABLES
DBMS_AQ_EXP_ZECURITY
DBMS_AQ_IMPORT_INTERNAL
DBMS_AQ_IMP_INTERNAL
DBMS_AQ_IMP_ZECURITY
DBMS_AQ_SYS_EXP_ACTIONS
DBMS_AQ_SYS_EXP_INTERNAL
DBMS_AQ_SYS_IMP_INTERNAL
DBMS_ASYNCRPC_PUSH
DBMS_AW
DBMS_AW_EXP
DBMS_BACKUP_RESTORE
DBMS_CAPTURE_ADM
DBMS_CAPTURE_ADM_INTERNAL
DBMS_CAPTURE_PROCESS
DBMS_CDC_PUBLISH
DBMS_CDC_SUBSCRIBE
DBMS_CDC_UTILITY
DBMS_CRYPTO_TOOLKIT
DBMS_CRYPTO_TOOLKIT_FFI
DBMS_CRYPTO_TOOLKIT_TYPES
DBMS_DDL
DBMS_DDL_INTERNAL
DBMS_DEBUG
DBMS_DEBUG_JDWP
DBMS_DEBUG_JDWP_CUSTOM
DBMS_DEFER
DBMS_DEFERGEN
DBMS_DEFERGEN_AUDIT
DBMS_DEFERGEN_INTERNAL
DBMS_DEFERGEN_LOB
DBMS_DEFERGEN_PRIORITY
DBMS_DEFERGEN_RESOLUTION
DBMS_DEFERGEN_UTIL
DBMS_DEFERGEN_WRAP
DBMS_DEFER_ENQ_UTL
DBMS_DEFER_IMPORT_INTERNAL
DBMS_DEFER_INTERNAL_QUERY
DBMS_DEFER_INTERNAL_SYS
DBMS_DEFER_QUERY
DBMS_DEFER_QUERY_UTL
DBMS_DEFER_REPCAT
DBMS_DEFER_SYS
DBMS_DEFER_SYS_PART1
DBMS_DESCRIBE
DBMS_DISTRIBUTED_TRUST_ADMIN
DBMS_DRS
DBMS_EPGC
DBMS_EXPORT_EXTENSION
DBMS_EXTENDED_TTS_CHECKS
DBMS_FGA
DBMS_FLASHBACK
DBMS_HS
DBMS_HS_ALT
DBMS_HS_CHK
DBMS_HS_UTL
DBMS_IAS_CONFIGURE
DBMS_IAS_INST
DBMS_IAS_INST_UTL
DBMS_IAS_INST_UTL_EXP
DBMS_IAS_MT_INST
DBMS_IAS_MT_INST_INTERNAL
DBMS_IAS_QUERY
DBMS_IAS_SESSION
DBMS_IAS_TEMPLATE
DBMS_IAS_TEMPLATE_INTERNAL
DBMS_IAS_TEMPLATE_UTL
DBMS_IJOB
DBMS_INTERNAL_LOGSTDBY
DBMS_INTERNAL_REPCAT
DBMS_INTERNAL_TRIGGER
DBMS_IREFRESH
DBMS_ISNAPSHOT
DBMS_ITRIGGER_UTL
DBMS_JAVA_TEST
DBMS_JOB
DBMS_LCR
DBMS_LOB
DBMS_LOCK
DBMS_LOGMNR
DBMS_LOGMNR_D
DBMS_LOGMNR_FFVTOLOGMNRT
DBMS_LOGMNR_INTERNAL
DBMS_LOGMNR_LOGREP_DICT
DBMS_LOGMNR_OCTOLOGMNRT
DBMS_LOGMNR_SESSION
DBMS_LOGREP_DEF_PROC
DBMS_LOGREP_DEF_PROC_UTL
DBMS_LOGREP_EXP
DBMS_LOGREP_IMP
DBMS_LOGREP_IMP_INTERNAL
DBMS_LOGREP_UTIL
DBMS_LOGSTDBY
DBMS_MAINT_GEN
DBMS_METADATA
DBMS_METADATA_INT
DBMS_METADATA_UTIL
DBMS_OBFUSCATION_TOOLKIT
DBMS_OBFUSCATION_TOOLKIT_FFI
DBMS_ODCI
DBMS_OFFLINE_INTERNAL
DBMS_OFFLINE_OG
DBMS_OFFLINE_RGT
DBMS_OFFLINE_SNAPSHOT
DBMS_OFFLINE_UTL
DBMS_OUTPUT
DBMS_PCLXUTIL
DBMS_PICKLER
DBMS_PIPE
DBMS_PITR
DBMS_PLUGTS
DBMS_PLUGTSP
DBMS_PROPAGATION_ADM
DBMS_PRVTAQIM
DBMS_PRVTAQIP
DBMS_PRVTAQIS
DBMS_PRVTRMIE
DBMS_PSP
DBMS_PSWMG_IMPORT
DBMS_RANDOM
DBMS_RCVMAN
DBMS_RECTIFIER_DIFF
DBMS_RECTIFIER_FRIENDS
DBMS_REDEFINITION
DBMS_REFRESH
DBMS_REFRESH_EXP_LWM
DBMS_REFRESH_EXP_SITES
DBMS_REGISTRY
DBMS_REGISTRY_SYS
DBMS_REPAIR
DBMS_REPCAT
DBMS_REPCAT_ADD_MASTER
DBMS_REPCAT_ADMIN
DBMS_REPCAT_AUTH
DBMS_REPCAT_CACHE
DBMS_REPCAT_COMMON_UTL
DBMS_REPCAT_CONF
DBMS_REPCAT_DECL
DBMS_REPCAT_FLA
DBMS_REPCAT_FLA_MAS
DBMS_REPCAT_FLA_UTL
DBMS_REPCAT_INSTANTIATE
DBMS_REPCAT_INTERNAL
DBMS_REPCAT_INTERNAL_PACKAGE
DBMS_REPCAT_MAS
DBMS_REPCAT_MIG
DBMS_REPCAT_MIG_INTERNAL
DBMS_REPCAT_OBJ_UTL
DBMS_REPCAT_OUTPUT
DBMS_REPCAT_RGT
DBMS_REPCAT_RGT_ALT
DBMS_REPCAT_RGT_CHK
DBMS_REPCAT_RGT_CUST
DBMS_REPCAT_RGT_CUST2
DBMS_REPCAT_RGT_EXP
DBMS_REPCAT_RGT_UTL
DBMS_REPCAT_RPC
DBMS_REPCAT_RPC_UTL
DBMS_REPCAT_RQ
DBMS_REPCAT_SNA
DBMS_REPCAT_SNA_UTL
DBMS_REPCAT_SQL_UTL
DBMS_REPCAT_UNTRUSTED
DBMS_REPCAT_UTL
DBMS_REPCAT_UTL2
DBMS_REPCAT_UTL3
DBMS_REPCAT_UTL4
DBMS_REPCAT_VALIDATE
DBMS_REPUTIL
DBMS_REPUTIL2
DBMS_RESOURCE_MANAGER
DBMS_RESOURCE_MANAGER_PRIVS
DBMS_RESUMABLE
DBMS_RLS
DBMS_RMGR_GROUP_EXPORT
DBMS_RMGR_PACT_EXPORT
DBMS_RMGR_PLAN_EXPORT
DBMS_RMIN
DBMS_ROWID
DBMS_RULE
DBMS_RULEADM_INTERNAL
DBMS_RULE_ADM
DBMS_RULE_COMPATIBLE_90
DBMS_RULE_EXIMP
DBMS_RULE_EXP_EC_INTERNAL
DBMS_RULE_EXP_EV_CTXS
DBMS_RULE_EXP_RL_INTERNAL
DBMS_RULE_EXP_RS_INTERNAL
DBMS_RULE_EXP_RULES
DBMS_RULE_EXP_RULE_SETS
DBMS_RULE_EXP_UTL
DBMS_RULE_IMP_OBJ
DBMS_SESSION
DBMS_SNAPSHOT
DBMS_SNAPSHOT_UTL
DBMS_SNAP_INTERNAL
DBMS_SNAP_REPAPI
DBMS_SPACE
DBMS_SPACE_ADMIN
DBMS_SQL
DBMS_SQLJTYPE
DBMS_STANDARD
DBMS_STATS
DBMS_STATS_INTERNAL
DBMS_STORAGE_MAP
DBMS_STREAMS
DBMS_STREAMS_ADM
DBMS_STREAMS_ADM_UTL
DBMS_SUMADV
DBMS_SUMADVISOR
DBMS_SUMMARY
DBMS_SUMREF_UTIL
DBMS_SUMVDM
DBMS_SYSTEM
DBMS_SYS_ERROR
DBMS_SYS_SQL
DBMS_TRACE
DBMS_TRANSACTION
DBMS_TRANSACTION_INTERNAL_SYS
DBMS_TRANSFORM
DBMS_TRANSFORM_EXIMP
DBMS_TTS
DBMS_TYPES
DBMS_TYPE_UTILITY
DBMS_UTILITY
DBMS_XMLGEN
DBMS_XPLAN
DBMS_XRWMV
DBMS_ZHELP
DBMS_ZHELP_IR
DES_ENCRYPTED_PASSWORD
DIANA
DICTIONARY_OBJ_NAME
DICTIONARY_OBJ_NAME_LIST
DICTIONARY_OBJ_OWNER
DICTIONARY_OBJ_OWNER_LIST
DICTIONARY_OBJ_TYPE
DIUTIL
GETTVOID
GRANTEE
HTF
HTP
INSTANCE_NUM
IS_ALTER_COLUMN
IS_CREATING_NESTED_TABLE
IS_DROP_COLUMN
IS_SERVERERROR
LOGIN_USER
LOGMNR_CREATE_REPLACE_METADATA
LOGMNR_DICT_CACHE
LOGMNR_DPC
LOGMNR_GTLO3
LOGMNR_KRVRDA_TEST_APPLY
LOGMNR_KRVRDLUID3
LOGMNR_KRVRDREPDICT3
LOGOFF_PROC
LOGON_PROC
LT
LTADM
LTAQ
LTDDL
LTDTRG
LTPRIV
LTRIC
LTUTIL
LT_CTX_PKG
LT_EXPORT_PKG
LT_REPLN
NO_VM_CREATE
NO_VM_CREATE_PROC
NO_VM_DROP
NO_VM_DROP_PROC
ODCICOLINFODUMP
ODCICONST
ODCIENVDUMP
ODCIINDEXALTEROPTIONDUMP
ODCIINDEXCALLPROPERTYDUMP
ODCIINDEXINFODUMP
ODCIINDEXINFOFLAGSDUMP
ODCIPREDINFODUMP
ODCIQUERYINFODUMP
ODCISTATSOPTIONSDUMP
OEMGETNEXTEXTEND
OLAP_TABLE
OUTLN_EDIT_PKG
OUTLN_PKG
OWA
OWA_CACHE
OWA_COOKIE
OWA_CUSTOM
OWA_IMAGE
OWA_OPT_LOCK
OWA_PATTERN
OWA_SEC
OWA_TEXT
OWA_UTIL
OWM_DDL_PKG
OWM_MIG_PKG
OWM_REPUTIL
PARTITION_POS
PBREAK
PBRPH
PBSDE
PBUTL
PIDL
PLITBLM
PRIVILEGE_LIST
PRVT_EGUTL
PRVT_EPGC
PSTUB
PSTUBT
REVOKEE
SERVER_ERROR
SERVER_ERROR_DEPTH
SERVER_ERROR_MSG
SERVER_ERROR_NUM_PARAMS
SERVER_ERROR_PARAM
SPACE_ERROR_INFO
SQL_TXT
STANDARD
STREAMS$_EVALUATION_CONTEXT
SUBPTXT
SUBPTXT2
SYSEVENT
SYS_IXMLAGG
SYS_LOGOFF
SYS_LOGON
SYS_STUB_FOR_PURITY_ANALYSIS
SYS_XMLAGG
UD_TRIGS
URIFACTORY
UTL_COLL
UTL_ENCODE
UTL_FILE
UTL_GDK
UTL_HTTP
UTL_INADDR
UTL_RAW
UTL_RECOMP
UTL_REF
UTL_SMTP
UTL_TCP
UTL_URL
UTL_XML
WITH_GRANT_OPTION
WM_DDL_UTIL
WM_ERROR
WPG_DOCLOAD
WPIUTL
XMLCONCAT
XMLSEQUENCEFROMREFCURSOR
XMLSEQUENCEFROMREFCURSOR2
XMLSEQUENCEFROMXMLTYPE
DBMS_REPCAT_AUTH
DEF$_PROPAGATOR_TRIG
ORA$_SYS_REP_AUTH
REPCATLOGTRIG
ORA$GRANT_SYS_SELECT
OWM_VALIDATE
ADD_JOB_HISTORY
COUNTRIES$RP
DEPARTMENTS$RP
EMPLOYEES$RP
JOBS$RP
JOB_HISTORY$RP
LOCATIONS$RP
REGIONS$RP
SECURE_DML
SECURE_EMPLOYEES
UPDATE_JOB_HISTORY
已选择398行。
SQL> CONN YANGTK/YANGTK@TEST
ERROR:
ORA-06553: PLS-213: STANDARD 包不可访问
访问程序包 DBMS_APPLICATION_INFO 时出错
已连接。
SQL> CONN /@TEST
AS SYSDBA
已连接。
SQL> alter package standard compile;
程序包已变更。
SQL> alter package dbms_standard compile;
程序包已变更。
SQL> @%ORACLE_HOME%rdbmsadminutlrp.sql
PL/SQL 过程已成功完成。
表已创建。
表已创建。
表已创建。
索引已创建。
表已创建。
表已创建。
视图已建立。
视图已建立。
程序包已创建。
没有错误。
程序包主体已创建。
没有错误。
PL/SQL 过程已成功完成。
PL/SQL 过程已成功完成。
SQL> SELECT COUNT(*) FROM DBA_OBJECTS WHERE STATUS = 'INVALID';
COUNT(*)
----------
6
SQL> SELECT OBJECT_NAME FROM DBA_OBJECTS WHERE STATUS = 'INVALID';
OBJECT_NAME
-------------------------------------------------------------------
ODCIARGDESC
ODCICOLINFO
ODCICOST
ODCIINDEXINFO
ODCIINDEXINFO
STREAMS$_EVALUATION_CONTEXT
已选择6行。
SQL> CONN YANGTK/YANGTK@TEST
已连接。
SQL>
至此,可以看到,原来失效的将近400个对象基本上都被重新编译通过,登陆时的错误也消失了。
需要注意的是,必须首先手工编译STANDARD包,然后编译DBMS_STANDARD包,utlrp脚本的正常运行的前提是这两个包正确。
yangtingkun 发表于:2004.11.16 19:26 ::分类: ( ORACLE ) ::阅读:(8494次) :: 评论 (15)
请问从哪儿获得rdbmsadminutlrp.sql, 在我的ORACLE_HOME及子目录中找不道该文件, 安装盘里也没有. 我用的是 Oracle 8.0.6.
谢谢!
xit 评论于: 2007.11.12 15:19 re: 从PUBLIC回收SELECT ANY TABLE权限 [回复]
这个包似乎是从8i才开始提供。
9以上的版本都有。
但是8肯定没有
yangtingkun 评论于: 2007.11.12 15:22 re: 从PUBLIC回收SELECT ANY TABLE权限 [回复]
多谢这么快的回复!那么最后一步在8里面用什么替代呢?或着您有相关的语句吗?
xit 评论于: 2007.11.12 15:44 re: 从PUBLIC回收SELECT ANY TABLE权限 [回复]
自己写过匿名块,对状态不正确的过程依次编译即可
yangtingkun 评论于: 2007.11.12 23:53 re: 从PUBLIC回收SELECT ANY TABLE权限 [回复]
需要考虑dependecy的,
yanggq 评论于: 2008.01.26 19:46 re: 从PUBLIC回收SELECT ANY TABLE权限 [回复]
不需要考虑DEPENDENCY,因为Oracle会对当前包所依赖的包进行级联编译
yangtingkun 评论于: 2008.01.26 23:29
来源:http://blog.itpub.net/post/468/5287