oracle 命名空间详解.docx
《oracle 命名空间详解.docx》由会员分享,可在线阅读,更多相关《oracle 命名空间详解.docx(16页珍藏版)》请在冰豆网上搜索。
oracle命名空间详解
一.初识Namespace
Oracle通过namespace来管理schemaobject的名字,关于Namespace的定义,在官网文档上没有找到一个详细的定义,在网上搜到一些相关信息:
SchemaObjectNamespaces
Anamespacedefinesagroupofobjecttypes,withinwhichallnamesmustbeuniquelyidentified—byschemaandname.Objectsindifferentnamespacescansharethesamename.
TheOracledatabaseusesnamespacestoresolveschemaobjectreferences.WhenyourefertoanobjectinaSQLstatement,OracleconsidersthecontextoftheSQLstatementandlocatestheobjectintheappropriatenamespace.Afterlocatingtheobject,Oracleperformstheoperationspecifiedbythestatementontheobject.Ifthenamedobjectcannotbefoundintheappropriatenamespace,thenOraclereturnsanerror.
Becausetablesandviewsareinthesamenamespace,atableandaviewinthesameschemacannothavethesamename.However,tablesandindexesareindifferentnamespaces.Therefore,atableandanindexinthesameschemacanhavethesamename.
Eachschemainthedatabasehasitsownnamespacesfortheobjectsitcontains.Thismeans,forexample,thattwotablesindifferentschemasareindifferentnamespacesandcanhavethesamename.
--以上解释提到了几点:
1.每个用户都有自己对应的namespace来保存自己的对象
2.表和视图存放在同一个namespace,所以对于同一个用户的表和视图不能重名,但是表和索引是存放在不同的namespace,所以可以重名。
开始时,我们提到Oracle通过schema和name来保证namespace中对象的唯一性。
在obj$字典里owner#对应用户的ID。
通过如下SQL,我们可以查看他们之间的对应关系:
/*Formattedon2011/7/2115:
41:
26(QP5v5.163.1008.3004)*/
SELECTusername,user_id
FROMdba_users
WHEREuser_idIN(SELECTDISTINCTowner#FROMobj$);
USERNAME USER_ID
-----------------------------------
SYS 0
SYSTEM 5
DBSNMP 24
SYSMAN 58
DAVE 61
OUTLN 11
MDSYS 46
ORDSYS 43
CTXSYS 36
EXFSYS 34
DMSYS 35
WMSYS 25
XDB 38
ORDPLUGINS 44
SI_INFORMTN_SCHEMA 45
OLAPSYS 47
SCOTT 54
ORACLE_OCM 55
TSMSYS 21
19rowsselected.
一个小示例验证以上结论:
SYS@anqing2(rac2)>createtableanqing(idnumber);
Tablecreated.
SYS@anqing2(rac2)>createindexanqingonanqing(id);
Indexcreated.
SYS@anqing2(rac2)>createviewanqingasselect*fromanqing;
createviewanqingasselect*fromanqing
*
ERRORatline1:
ORA-00955:
nameisalreadyusedbyanexistingobject
以下类型的对象使用同一个namespace:
•Tables
•Views
•Sequences
•Privatesynonyms
•Stand-aloneprocedures
•Stand-alonestoredfunctions
•Packages
•Materializedviews
•User-definedtypes
如下类型的对象使用自己的namespace:
•Indexes
•Constraints
•Clusters
•Databasetriggers
•Privatedatabaselinks
•Dimensions
以下Nonschemaobjects使用自己的namespace:
•Userroles
•Publicsynonyms
•Publicdatabaselinks
•Tablespaces
•Profiles
•Parameterfiles(PFILEs)andserverparameterfiles(SPFILEs)
以上信息随Oracle版本不同,可能有出入。
二.深入研究Namespace
先执行如下SQL,查看每个namespace对应名称和它所包含的对象的个数:
/*Formattedon2011/7/2114:
24:
47(QP5v5.163.1008.3004)*/
SELECTnamespace,object_type,COUNT(*)
FROM(SELECTnamespace,
DECODE(o.type#,
0,'NEXTOBJECT',
1,'INDEX',
2,'TABLE',
3,'CLUSTER',
4,'VIEW',
5,'SYNONYM',
6,'SEQUENCE',
7,'PROCEDURE',
8,'FUNCTION',
9,'PACKAGE',
11,'PACKAGEBODY',
12,'TRIGGER',
13,'TYPE',
14,'TYPEBODY',
19,'TABLEPARTITION',
20,'INDEXPARTITION',
21,'LOB',
22,'LIBRARY',
23,'DIRECTORY',
24,'QUEUE',
28,'JAVASOURCE',
29,'JAVACLASS',
30,'JAVARESOURCE',
32,'INDEXTYPE',
33,'OPERATOR',
34,'TABLESUBPARTITION',
35,'INDEXSUBPARTITION',
40,'LOBPARTITION',
41,'LOBSUBPARTITION',
42,'MATERIALIZEDVIEW',
43,'DIMENSION',
44,'CONTEXT',
46,'RULESET',
47,'RESOURCEPLAN',
48,'CONSUMERGROUP',
51,'SUBSCRIPTION',
52,'LOCATION',
55,'XMLSCHEMA',
56,'JAVADATA',
57,'SECURITYPROFILE',
59,'RULE',
62,'EVALUATIONCONTEXT',
'UNDEFINED')
object_type
FROMsys.obj$o)
GROUPBYnamespace,object_type;
NAMESPACEOBJECT_TYPE COUNT(*)
--------------------------------------
4INDEX 2253
2TYPEBODY 175
51UNDEFINED 6
21CONTEXT 5
9DIRECTORY 6
1SYNONYM 20122
1PACKAGE 859
1VIEW 3684
1PROCEDURE 98
3TRIGGER 164
38EVALUATIONCONTEXT 12
1SEQUENCE 138
2PACKAGEBODY 804
1INDEXTYPE 10
1TYPE 1953
24RESOURCEPLAN 3
4INDEXPARTITION 144
25XMLSCHEMA 25
1TABLE 1619
8LOB 541
10QUEUE 23
23RULESET 15
8LOBPARTITION 1
36RULE 4
1JAVACLASS 16450
1NEXTOBJECT 1
1FUNCTION 268
1UNDEFINED 660
1LIBRARY 154
32JAVADATA 298
5CLUSTER 10
24CONSUMERGROUP 5
1TABLEPARTITION 124
1OPERATOR 57
14JAVARESOURCE 775
35rowsselected.
通过这个查询结果,我们可以看到一些对象使用相同的namespace。
第一列的数字代表的就是namespace。
关于type#的定义,在Oracle的obj$基表创建的定义SQL有明确的说明。
先在$ORACLE_HOME/RDBMS/admin/bin下查找sql.bsq脚本。
sql.bsq主要记录了ORACLE中的系统字典表的定义,比如过tab$,col$,obj$等,通过查询这个文件可以知道数据字典表的定义.在sql.bsq里面保存了相关的脚本信息,其中就有dcore.bsq脚本,在该脚本里就可以找到obj$表的定义SQL:
/*Formattedon2011/7/2114:
42:
51(QP5v5.163.1008.3004)*/
CREATETABLEobj$ /*objecttable*/
(
obj# NUMBERNOTNULL, /*objectnumber*/
dataobj# NUMBER, /*datalayerobjectnumber*/
owner# NUMBERNOTNULL, /*ownerusernumber*/
name VARCHAR2("M_IDEN")notnull, /*objectname*/
namespace numbernotnull, /*namespaceofobject(seeKQD.H):
*/
/*1=TABLE/PROCEDURE/TYPE,2=BODY,3=TRIGGER,4=INDEX,5=CLUSTER,*/
/*8=LOB,9=DIRECTORY,*/
/*10=QUEUE,11=REPLICATIONOBJECTGROUP,12=REPLICATIONPROPAGATOR,*/
/*13=JAVASOURCE,14=JAVARESOURCE*/
/*58=(DataMining)MODEL*/
subname varchar2("M_IDEN"), /*subordinatetothename*/
type# numbernotnull, /*objecttype(seeKQD.H):
*/
/*1=INDEX,2=TABLE,3=CLUSTER,4=VIEW,5=SYNONYM,6=SEQUENCE,*/
/*7=PROCEDURE,8=FUNCTION,9=PACKAGE,10=NON-EXISTENT,*/
/*11=PACKAGEBODY,12=TRIGGER,13=TYPE,14=TYPEBODY,*/
/*19=TABLEPARTITION,20=INDEXPARTITION,21=LOB,22=LIBRARY,*/
/*23=DIRECTORY,24=QUEUE,*/
/*25=IOT,26=REPLICATIONOBJECTGROUP,27=REPLICATIONPROPAGATOR,*/
/*28=JAVASOURCE,29=JAVACLASS,30=JAVARESOURCE,31=JAVAJAR,*/
/*32=INDEXTYPE,33=OPERATOR,34=TABLESUBPARTITION,*/
/*35=INDEXSUBPARTITION*/
/*82=(DataMining)MODEL*/
/*92=OLAPCUBEDIMENSION, 93=OLAPCUBE*/
/*94=OLAPMEASUREFOLDER,95=OLAPCUBEBUILDPROCESS*/
ctime datenotnull, /*objectcreationtime*/
mtime datenotnull, /*DDLmodificationtime*/
stime datenotnull, /*specificationtimestamp(version)*/
status numbernotnull, /*statusofobject(seeKQD.H):
*/
/*1=VALID/AUTHORIZEDWITHOUTERRORS,*/
/*2=VALID/AUTHORIZEDWITHAUTHORIZATIONERRORS,*/
/*3=VALID/AUTHORIZEDWITHCOMPILATIONERRORS,*/
/*4