在一个数据库中可以有多个应用的数据表,这些不同应用的表可以放在不同的schema之中,' E8 b1 M. T6 F, V# Y: ~+ k2 n
. k& u: g- ?0 H$ k& O1 I0 ~
同时,每一个schema对应一个用户,不同的应用可以以不同的用户连接数据库,: R! P! g4 h( [, p, q
) w, y% x/ r! _. } 这样,一个大数据库就可以根据应用把其表分开来管理。, Q9 f# t& _' F! }
m2 `6 N9 k5 u 不同的schema之间它们没有直接的关系,不同的shcema之间的表可以同名,1 b1 f% d' c' } h: m) j0 M' N
! p$ c/ H1 A. b9 _6 t" ]: V9 E 也可以互相引用(但必须有权限),在没有操作别的schema的操作根权下,+ }( z6 W ^; Q1 v5 J: }' Y
2 C. X% u% c* {# x4 K 每个用户只能操作它自己的schema下的所有的表。不同的schema下的同名的表,
6 G6 z6 Q. H! Y( ?6 i
" B) l) I1 h/ \( D6 v; ^6 h 可以存入不同的数据(即schema用户自己的数据)。
2 [6 ]7 y0 D% b0 ` , a2 M! F3 r0 z9 c
Oracle里schema几乎和user/用户是通用的。schema是指一组数据库object! r7 J1 A6 \2 J: s
" Y, S5 e# y' f& j: x, q (比如:表,视图,包,序列,等等),而这些object是属于用户的,* l" N n3 p' o' o) h! M: S" B; I$ A
4 b' R( D0 p8 Q4 H
属于一个用户的所有object就叫schema." G5 D' `" Z7 m% J9 [9 e w/ `- G
0 ~3 i4 f5 J6 n+ B6 B% C 如果你使用Oracle的企业管理器Enterprise Manager,你会发现里面的用户就叫schema.1 S @6 {" @7 p$ [; K
5 d* c! n" K% \! A
Schema 中文意思是 方案。 "方案"只是 Oracle 一个分类,不同用户有不同的方案。5 T; e. m9 a; B' }2 x% |
) H5 u* a' }9 e$ I/ E
拿 DBA Studio 来说吧,在左边分了四大类:(例程,存储,安全,方案)
( Y9 k; E+ |. Y C , i' ?$ v' ]* |" r5 o- \3 ~# H
例程: 是管理库的启动…之类的。 www.2cto.com
: Q- T7 L! W( F" S; ?& F0 f5 P ) i3 C- h U8 x: D/ O
存储: 管理表空间,数据文件之类。, _. p" p% P; q& Y
6 T; s, B& q- R+ }* Z, z0 Q5 c
安全: 就是管理用户(密码,表空间分配…)4 ?) l- ?# k) o. F7 ~
* D! Z" h1 a, O5 ?) s. Y" s
方案: 有(表,视图,存储过程…),不同用户有不同的案。/ b8 y. k0 v, `6 c! w
5 c0 p' p6 y- f: {& [7 L 如: 在"方案"->选你的"用户名"之后,才会出现用户名相关的表。 }$ g+ C! M- Y0 i3 c) p& Q
2 L! L, \# W" ]! z4 i ----------------------------两个不容易理解的概念──user和schema8 `( H! o4 ], p) o% Z$ Z
" D9 d9 i' b0 V7 F% ~6 F* @
user是控制权限的,而schema则是一个容器,非所有者如果需要访问这个容器下的对象
" u! L! f7 i! ?1 \ N0 N 3 H; _- X O5 v- ?
就需要在对象前面写上schema(owner)的名字,如果不想写而又没有创建synonym,此时可以通过alter session set current_schema=schema_name来改变当前session的schema从而在访问对象时省去schema(owner);最终能否访问对象还是要看是否有访问这个对象的权限而和schema无关。' p4 R0 }; z3 x$ g+ ]
- ^! j& v7 i: X& D; \5 _
深入理解user和schema的区别:
3 M! B% |/ \$ N" Z ]' w c+ e
- |! p6 r. ?+ S* I& n user即Oracle中的用户,和所有系统的中用户概念类似,用户所持有的是系统的权限及资源;
9 N! c' C2 m+ j$ \) a$ o% L + f; c- V+ g! k5 \
而schema所涵盖的是各种对象,它包含了表、函数、包等等对象的"所在地",并不包括对他们的权限控制。
6 N6 H; X- z( w; c' X0 E0 }8 u
2 i1 t4 B: @( _$ ]: z* A 好比一个房子,里面放满了家具,对这些家具有支配权的是房子的主人(user),而不是房子(schema)。
& \5 [& V* N1 j3 r1 V2 z2 k# D9 {
' Q, G& h0 f! e; ?$ A 你可以也是一个房子的主人(user),拥有自己的房子(schema)。可以通过alter session的方式9 o3 |$ w" O N# o& A
- Q( k, ~$ F7 L' R' ]; P 进入别人的房子。
1 `8 ~" A, a* {. b e: B
+ N. a) Z2 {+ |- |( p: c 这个时候,你可以看到别人房子里的家具(desc)。
4 I" G9 Y* U* i7 F# ~- z6 u
% s( X4 N5 y" {& x- H; C# E* L 如果你没有特别指定的话,你所做的操作都是针对你当前所在房子中的东西。( @4 v( o' P, {. f1 ~/ S3 V; t
& s' l9 O P2 { 至于你是否有权限使用(select)、搬动(update)或者拿走(delete)这些家具就看这个房子的
# Q: P# D+ B1 \6 T( n* U# {. E
3 `$ h. Z- j9 j5 D# v 主人有没有给你这样的权限了,或者你是整个大厦(DB)的老大(DBA)。* D# ]8 o1 E: S+ U6 t
; }. i7 f# k7 t5 @6 C
alter session set schema可以用来代替synonyms.! @: Q p* \% l' p0 D; j
) B$ Y7 t+ \7 T
如果你想调用其他schema的对象(有权限的前提下),但并没有建synonym,
1 B/ I) K2 [# [$ D* e9 S) u
5 Y5 l. q# R8 `/ k; W& Y 同时又不想把其他schema名字放入代码中,就可以首先使用alter session set schema=. |