日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ORACLE中的两个概念:user和schema的区别和联系

發(fā)布時間:2024/4/17 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ORACLE中的两个概念:user和schema的区别和联系 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

http://oracle.chinaitlab.com/induction/835839.html

今天重讀ORACLE官方文檔《concepts》,讀到schema的基本概念,對它的理解更進一層,官方文檔中關(guān)于schema是這樣解釋的:

  “A schema is a collection of database objects. A schema is owned by a database user and has the same name as that user. Schema objects are the logical structures that directly refer to the database's data. Schema objects include structures like tables, views, and indexes.(There is no relationship between a tablespace and a schema. Objects in the same schema can be in different tablespaces, and a tablespace can hold objects from different schemas.)”

  官方文檔里面說得比較明白,schema是數(shù)據(jù)對象的集合,包括像表、視圖、索引、同義詞等等都可以說是schema的對象。但不夠生動,網(wǎng)上有篇文章里面把schema和user的關(guān)系用一個形象的比喻闡述得非常透徹,引用如下:

  “user即Oracle中的用戶,和所有系統(tǒng)的中用戶概念類似,用戶所持有的是系統(tǒng)的權(quán)限及資源;而schema所涵蓋的是各種對象,它包含了表、函數(shù)、包等等對象的“所在地”,并不包括對他們的權(quán)限控制。好比一個房子,里面放滿了家具,對這些家具有支配權(quán)的是房子的主人(user),而不是房子(schema)。你可以也是一個房子的主人(user),擁有自己的房子(schema).可以通過alter session的方式進入別人的房子。如果你沒有特別指定的話,你所做的操作都是針對你當(dāng)前所在房子中的東西。至于你是否有權(quán)限使用(select)、搬動(update)或者拿走(delete)這些家具就看這個房子的主人有沒有給你這樣的權(quán)限了,或者你是整個大廈(DB)的老大(DBA)。alter session set schema可以用來代替synonyms。如果你想調(diào)用其他schema的對象(有權(quán)限的前提下),但并沒有建synonym,同時又不想把其他 schema名字放入代碼中,就可以首先使用alter session set schema=<其他schema名字>。”

  這段文字說得非常生動,把user和schema的區(qū)別闡述得很透徹,下面通過具體的例子來加深對user和schema兩者區(qū)別的認識:

  第一步,以sys用戶登陸SQL并建立普通用戶storm和penguin:

  $ sqlplus / as sysdba

  SQL> create user storm identified by storm;

  User created.

  SQL> create user penguin identified by penguin;

  User created.

  第二步,賦予一些基本的權(quán)限給新建的用戶storm和penguin:

  SQL> grant connect,create table,resource to storm,penguin;

  Grant succeeded.

  第三步,以storm用戶登陸,創(chuàng)建一張表并插入數(shù)據(jù):

  SQL> conn storm/storm

  Connected.

  SQL> create table t (id int);

  Table created.

  SQL> insert into t values(1);

  1 row created.

  SQL> commit;

  Commit complete.

  第四步,以penguin用戶登陸,看能否查詢storm用戶所建表里面的數(shù)據(jù):

  SQL> conn penguin/penguin

  Connected.

  SQL> select table_name from user_tables;

  no rows selected

  SQL> show user;

  USER is "PENGUIN"

  SQL> select * from storm.t;

  select * from storm.t

  *

  ERROR at line 1:

  ORA-00942: table or view does not exist

  從以上結(jié)果可以看出,用戶 penguin無法查看用戶storm所建表里面的內(nèi)容,甚至被告知沒有這張表。

  第五步,修改當(dāng)前schema為storm,并繼續(xù)查詢:

  SQL> alter session set current_schema=storm;

  Session altered.

  SQL> show user;

  USER is "PENGUIN"

  SQL> select * from storm.t;

  select * from storm.t

  *

  ERROR at line 1:

  ORA-00942: table or view does not exist

  仍然不能查看。

  第六步,以storm用戶登陸,賦予penguin用戶查看t表的權(quán)限:

  SQL> conn storm/storm

  Connected.

  SQL> grant select on t to penguin;

  Grant succeeded.

  第七步,以penguin用戶登陸,查看storm用戶的t表:

  SQL> conn penguin/penguin

  Connected.

  SQL> select * from storm.t;

  ID

  ----------

  1

  更簡單的,將當(dāng)前schema更改為storm,可以簡化查詢過程:

  SQL> alter session set current_schema=storm;

  Session altered.

  SQL> select * from t;

  ID

  ----------

  1

  這個實驗下來,對user和schema的區(qū)別和聯(lián)系應(yīng)該有了進一步的理解了。

?

?

==========

http://langgufu.iteye.com/blog/1469055

有的人還是對schema的真正含義不太理解,現(xiàn)在我再次整理了一下,希望對大家有所幫助。

我們先來看一下他們的定義:
A schema is a collection of database objects (used by a user.).
Schema objects are the logical structures that directly refer to the database’s data.
A user is a name defined in the database that can connect to and access objects.
Schemas and users help database administrators manage database security.

從定義中我們可以看出schema為數(shù)據(jù)庫對象的集合,為了區(qū)分各個集合,我們需要給這個集合起個名字,這些名字就是我們在企業(yè)管理器的方案下看到的許多類似用戶名的節(jié)點,這些類似用戶名的節(jié)點其實就是一個schema,schema里面包含了各種對象如tables, views, sequences, stored procedures, synonyms, indexes, clusters, and database links。

一個用戶一般對應(yīng)一個schema,該用戶的schema名等于用戶名,并作為該用戶缺省schema。這也就是我們在企業(yè)管理器的方案下看到schema名都為數(shù)據(jù)庫用戶名的原因。Oracle數(shù)據(jù)庫中不能新創(chuàng)建一個schema,要想創(chuàng)建一個schema,只能通過創(chuàng)建一個用戶的方法解決(Oracle中雖然有create schema語句,但是它并不是用來創(chuàng)建一個schema的),在創(chuàng)建一個用戶的同時為這個用戶創(chuàng)建一個與用戶名同名的schem并作為該用戶的缺省shcema。即schema的個數(shù)同user的個數(shù)相同,而且schema名字同user名字一一 對應(yīng)并且相同,所有我們可以稱schema為user的別名,雖然這樣說并不準確,但是更容易理解一些。

一個用戶有一個缺省的schema,其schema名就等于用戶名,當(dāng)然一個用戶還可以使用其他的schema。如果我們訪問一個表時,沒有指明該表屬于哪一個schema中的,系統(tǒng)就會自動給我們在表上加上缺省的sheman名。比如我們在訪問數(shù)據(jù)庫時,訪問scott用戶下的emp表,通過select * from emp; 其實,這sql語句的完整寫法為select * from scott.emp。在數(shù)據(jù)庫中一個對象的完整名稱為schema.object,而不屬user.object。類似如果我們在創(chuàng)建對象時不指定該對象的schema,在該對象的schema為用戶的缺省schema。這就像一個用戶有一個缺省的表空間,但是該用戶還可以使用其他的表空間,如果我們在創(chuàng)建對象時不指定表空間,則對象存儲在缺省表空間中,要想讓對象存儲在其他表空間中,我們需要在創(chuàng)建對象時指定該對象的表空間。

咳,說了這么多,給大家舉個例子,否則,一切枯燥無味!
SQL> Gruant dba to scott

SQL> create table test(name char(10));
Table created.

SQL> create table system.test(name char(10));
Table created.

SQL> insert into test values('scott');
1 row created.

SQL> insert into system.test values('system');
1 row created.

SQL> commit;
Commit complete.

SQL> conn system/manager
Connected.

SQL> select * from test;
NAME
----------
system

SQL> ALTER SESSION SET CURRENT_SCHEMA = scott; --改變用戶缺省schema名
Session altered.

SQL> select * from test;
NAME
----------
scott

SQL> select owner ,table_name from dba_tables where table_name=upper('test');
OWNER TABLE_NAME
------------------------------ ------------------------------
SCOTT TEST
SYSTEM TEST
--上面這個查詢就是我說將schema作為user的別名的依據(jù)。實際上在使用上,shcema與user完全一樣,沒有什么區(qū)別,在出現(xiàn)schema名的地方也可以出現(xiàn)user名。

表空間:

一個表空間就是一片磁盤區(qū)域,他又一個或者多個磁盤文件組成,一個表空間可以容納許多表、索引或者簇等
每個表空間又一個預(yù)制的打一磁盤區(qū)域稱為初始區(qū)間(initial extent)用完這個區(qū)間厚在用下一個,知道用完表空間,這時候需要對表空間進行擴展,增加數(shù)據(jù)文件或者擴大已經(jīng)存在的數(shù)據(jù)文件

?

?


instance是一大坨內(nèi)存sga,pga....和后臺的進程smon pmon.....組成的一個大的應(yīng)用。
schema就是一個用戶和他下面的所有對象。。
tablspace 邏輯上用來放objects.物理上對應(yīng)磁盤上的數(shù)據(jù)文件或者裸設(shè)備。

在Oracle中,結(jié)合邏輯存儲與物理存儲的概念,我們可以這樣來理解數(shù)據(jù)庫、表空間、SCHEMA、數(shù)據(jù)文件這些概念:
數(shù)據(jù)庫是一個大圈,里面圈著的是表空間,表空間里面是數(shù)據(jù)文件,那么schema是什么呢?schema是一個邏輯概念,是一個集合,但schema并不是一個對象,oracle也并沒有提供創(chuàng)建schema的語法。

schema:
一般而言,一個用戶就對應(yīng)一個schema,該用戶的schema名等于用戶名,并作為該用戶缺省schema,用戶是不能創(chuàng)建schema的,schema在創(chuàng)建用戶的時候創(chuàng)建,并可以指定用戶的各種表空間(這點與PostgreSQL是不同,PostgreSQL是可以創(chuàng)建schema并指派給某個用戶)。當(dāng)前連接到數(shù)據(jù)庫上的用戶創(chuàng)建的所有數(shù)據(jù)庫對象默認都屬于這個schema(即在不指明schema的情況下),比如若用戶scott連接到數(shù)據(jù)庫,然后create table test(id int not null)創(chuàng)建表,那么這個表被創(chuàng)建在了scott這個schema中;但若這樣create kanon.table test(id int not null)的話,這個表被創(chuàng)建在了kanon這個schema中,當(dāng)然前提是權(quán)限允許。
創(chuàng)建用戶的方法是這樣的:
create user 用戶名 identified by 密碼
default tablespace 表空間名
temporary tablespace 表空間名
quota 限額 (建議創(chuàng)建的時候指明表空間名)
由此來看,schema是一個邏輯概念。
但一定要注意一點:schema好像并不是在創(chuàng)建user時就創(chuàng)建的,而是在該用戶創(chuàng)建了第一個對象之后才將schema真正創(chuàng)建的,只有user下存在對象,他對應(yīng)的schema才會存在,如果user下不存在任何對象了,schema也就不存在了;

?

數(shù)據(jù)庫:
在oracle中,數(shù)據(jù)庫是由表空間來組成的,而表空間里面是具體的物理文件---數(shù)據(jù)文件。我們可以創(chuàng)建數(shù)據(jù)庫并為其指定各種表空間。

?

表空間:
這是個邏輯概念,本質(zhì)上是一個或者多個數(shù)據(jù)文件的集合。

?

數(shù)據(jù)文件:
具體存儲數(shù)據(jù)的物理文件,是一個物理概念。

一個數(shù)據(jù)文件只能屬于一個表空間,一個表空間可以包含一個或多個數(shù)據(jù)文件。一個數(shù)據(jù)庫由多個表空間組成,一個表空間只能屬于一個數(shù)據(jù)庫。

?

若還不理解,下面是我從網(wǎng)上摘的一個比喻,很形象的解釋了什么是Database,什么是Schema,什么是Table,什么是列,什么是行,什么是User,不妨一看。
“我們可以把Database看作是一個大倉庫,倉庫分了很多很多的房間,Schema就是其中的房間,一個Schema代表一個房間,Table可以看作是每個Schema中的床,Table(床)被放入每個房間中,不能放置在房間之外,那豈不是晚上睡覺無家可歸了,然后床上可以放置很多物品,就好比 Table上可以放置很多列和行一樣,數(shù)據(jù)庫中存儲數(shù)據(jù)的基本單元是Table,現(xiàn)實中每個倉庫放置物品的基本單位就是床, User就是每個Schema的主人,(所以Schema包含的是Object,而不是User),user和schema是一一對應(yīng)的,每個user在沒有特別指定下只能使用自己schema(房間)的東西,如果一個user想使用其他schema(房間)的東西,那就要看那個schema(房間)的user(主人)有沒有給你這個權(quán)限了,或者看這個倉庫的老大(DBA)有沒有給你這個權(quán)限了。換句話說,如果你是某個倉庫的主人,那么這個倉庫的使用權(quán)和倉庫中的所有東西都是你的(包括房間),你有完全的操作權(quán),可以扔掉不用的東西從每個房間,也可以放置一些有用的東西到某一個房間,你還可以給每個User分配具體的權(quán)限,也就是他到某一個房間能做些什么,是只能看(Read-Only),還是可以像主人一樣有所有的控制權(quán)(R/W),這個就要看這個User所對應(yīng)的角色Role了。”---摘自網(wǎng)絡(luò)

============= http://www.itxuexi.com/tech/9163.html 常被oracle的幾個概念搞得很暈,和公司做pl/sql的同事討論后,又到網(wǎng)上搜索下,現(xiàn)將個人對這幾個概念的理解做個筆記: 先通俗的解釋下數(shù)據(jù)庫這個概念,數(shù)據(jù)庫就是存儲在磁盤上的文件,這些文件中保存的數(shù)據(jù)有一定的物理結(jié)構(gòu)和邏輯結(jié)構(gòu)。 數(shù)據(jù)庫名 就是數(shù)據(jù)庫的名稱標(biāo)識,如myOracle, 這種叫法一般只適用于單機; 全局數(shù)據(jù)庫名 就是數(shù)據(jù)庫處于一個網(wǎng)絡(luò)中的名稱標(biāo)識。比如數(shù)據(jù)庫宿主機的域為mydomain, 則數(shù)據(jù)庫的全局數(shù)據(jù)庫名為myOracle.mydomain; 實際上myOracle和myOracle.mydomain兩者指的是同一個數(shù)據(jù)庫. 即:全局數(shù)據(jù)庫名 = 數(shù)據(jù)庫名+"."+網(wǎng)絡(luò)位置(宿主機所在的域) 設(shè)定全域數(shù)據(jù)庫名稱Oracle9i 的全域數(shù)據(jù)庫名稱由「數(shù)據(jù)庫名稱」與「網(wǎng)域名稱」所組成,其中「數(shù)據(jù)庫名稱」設(shè)定于 DB_NAME 起始參數(shù),而「網(wǎng)域名稱」則是設(shè)定于 DB_DOMAIN 參數(shù)。這兩個參數(shù)合并之后就可以在網(wǎng)際網(wǎng)絡(luò)上唯一識別每一個 Oracle9i 數(shù)據(jù)庫。舉例來說,假設(shè)我們欲建立的 Oracle9i 數(shù)據(jù)庫之全域數(shù)據(jù)庫名稱為 mydb.uuu.com.tw,那么可在起始參數(shù)檔內(nèi)設(shè)定下列兩參數(shù):DB_NAME = mydbDB_DOMAIN = uuu.com.tw
?
Tips: 您可以執(zhí)行 ALTER DATABASE RENAME GLOBAL_NAME 指令更改 Oracle9i 數(shù)據(jù)庫的全域數(shù)據(jù)庫名稱;在您更改 DB_NAME 與 DB_DOMAIN 這兩個起始參數(shù)后必須將 Oracle9i 數(shù)據(jù)庫重新激活才會生效。此外,控制檔也必須重新建立。關(guān)于 DB_NAME 起始參數(shù)DB_NAME必須是文字字符串,且不能超過 8 個字符。在建立數(shù)據(jù)庫的過程中,DB_NAME設(shè)定值會記錄在資料文件、控制文件、以及重置日志文件之中。如果您激活 Oracle9i Instance 的時候,起始參數(shù)檔內(nèi)設(shè)定的DB_NAME不同于控制文件內(nèi)所紀錄的,那么數(shù)據(jù)庫將無法激活。關(guān)于 DB_DOMAIN 起始參數(shù)DB_DOMAIN通常是數(shù)據(jù)庫主機所在位置的網(wǎng)域名稱。如果您欲建立的數(shù)據(jù)庫將加入分布式數(shù)據(jù)庫運算環(huán)境,請?zhí)貏e注意此參數(shù)的設(shè)定。 ? SID = Oracle實例 SID是Oracle實例的唯一名稱標(biāo)識, 用戶去訪問數(shù)據(jù)庫,實際上是向某一個Oracle實例發(fā)送請求,oracle實例負責(zé)向數(shù)據(jù)庫獲取數(shù)據(jù)。 Oracle實例 = 內(nèi)存結(jié)構(gòu)+后臺進程,所以O(shè)racle實例是臨時性的; 可以通過startup nomount去啟動實例,但是注意這時Oracle數(shù)據(jù)庫并沒有啟動,需要用open去啟動數(shù)據(jù)庫; 一個實例只能對應(yīng)一個數(shù)據(jù)庫,一個數(shù)據(jù)庫可以用多個實例; 命名空間,有點復(fù)雜。 命名空間定義了一組對象類型,在命名空間里,對象的名字必須是唯一的,當(dāng)然,在不同的命名空間里,是可以使用相同的的名字的。 下面的對象類型共享同一個命名空間: ? Tables ? Views ? Sequences ? Private synonyms ? Stand-alone procedures ? Stand-alone stored functions ? Packages ? Materialized views ? User-defined types 因此,如果數(shù)據(jù)庫中有一個表叫做myObject1,那么就不能再創(chuàng)建一個叫做myObject1的視圖,至少,在一個schema中是不可能出現(xiàn)這種現(xiàn)象的; 下面的對象類型有各自的命名空間: ? Indexes ? Constraints ? Clusters ? Database triggers ? Private database links ? Dimensions 所以你可以創(chuàng)建一個叫做myObject1的索引,即使在相同的schema中; 不受Schema局限的對象類型(Non schema objects)有它們自己的命名空間,如下: ? User roles ? Public synonyms ? Public database links ? Tablespaces ? Profiles ? Parameter files (PFILEs) and server parameter files (SPFILEs) 所以兩個Non-schema objects可以用相同的名字。 Schema是基于用戶的, 在數(shù)據(jù)庫中創(chuàng)建一個用戶,就創(chuàng)建了一個和用戶名相同的Shema。Namespace是基于數(shù)據(jù)庫的.

?

總結(jié)

以上是生活随笔為你收集整理的ORACLE中的两个概念:user和schema的区别和联系的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。