天天看點

Oracle的schema,user

我們先來看一下他們的定義:

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為資料庫對象的集合,為了區分各個集合,我們需要給這個集合起個名字,這些名字就是我們在企業管理器的方案下看到的許多類 似使用者名的節點,這些類似使用者名的節點其實就是一個schema,schema裡面包含了各種對象如tables, views, sequences, stored procedures, synonyms, indexes, clusters, and database links。

一個使用者一般對應一個schema,該使用者的schema名等于使用者名,并作為該使用者預設schema。這也就是我們在企業 管理器的方案下看到schema名都為資料庫使用者名的原因。Oracle資料庫中不能新建立一個schema,要想建立一個schema,隻能通過建立一 個使用者的方法解決(Oracle中雖然有create schema語句,但是它并不是用來建立一個schema的),在建立一個使用者的同時為這個使用者建立一個與使用者名同名的schem并作為該使用者的預設 shcema。即schema的個數同user的個數相同,而且schema名字同user名字一一 對應并且相同,所有我們可以稱schema為user的别名,雖然這樣說并不準确,但是更容易了解一些。

一個使用者有一個預設的 schema,其schema名就等于使用者名,當然一個使用者還可以使用其他的schema。如果我們通路一個表時,沒有指明該表屬于哪一個schema中 的,系統就會自動給我們在表上加上預設的sheman名。比如我們在通路資料庫時,通路scott使用者下的emp表,通過select * from emp; 其實,這sql語句的完整寫法為select * from scott.emp。在資料庫中一個對象的完整名稱為schema.object,而不屬user.object。類似如果我們在建立對象時不指定該對象 的schema,在該對象的schema為使用者的預設schema。這就像一個使用者有一個預設的表空間,但是該使用者還可以使用其他的表空間,如果我們在創 建對象時不指定表空間,則對象存儲在預設表空間中,要想讓對象存儲在其他表空間中,我們需要在建立對象時指定該對象的表空間。

oracle中的schema就是指一個使用者下所有對象的集合,schema本身不能了解成一個對象,oracle并沒有提供建立schema的文法,schema我自己了解也并不是在建立user時就建立,而是在該使用者下建立第一個對象之後schema也随之産生,隻要user下存在對象,schema就一定存在,user下如果不存在對象,schema也不存在;這一點類似于temp tablespace group,另外也可以通過oem來觀察,如果建立一個新使用者,該使用者下如果沒有對象則schema不存在,如果建立一個對象則和使用者同名的schema也随之産生。。。如果此時把對象删除,schema是否還存在,這一點需要驗證一下。。。沒有oem,無法驗證。。。

另外在建立ddl trigger時:

create or replace trigger trigger_name

after||before ddl on username.schema....

通過上面文法我們就能很好的了解schema是指使用者username下的所有對象。。。

咳,說了這麼多,給大家舉個例子,否則,一切枯燥無味!

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的别名的依據。實際上在使用上,shcema與user完全一樣,沒有什麼差別,在出現schema名的地方也可以出現user名。