(一)什麼叫使用者(user):
A user is a name defined in the database that can connect to and access objects.
使用者是用串連資料庫和訪問資料庫物件的。(使用者是用來串連資料庫訪問資料庫)。
(二)什麼叫模式(schema):
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.
模式是資料庫物件的集合。模式對象是資料庫資料的邏輯結構。
(把資料庫物件用模式分開成不同的邏輯結構)。
(三)使用者(user)與模式(schema)的區別:
Schemas and users help database administrators manage database security.
使用者是用來串連資料庫物件。而模式用是用建立管理對象的。模式跟使用者在oracle 是一對一的關係。
( 不過db2卻不同,db2 一個使用者可以對應多個模式,db2 使用者是系統,他首先必須獲得系統使用者才能成為資料庫使用者,也就是資料庫使用者就是系統使用者,只有模式才是資料庫類似使用者。有興趣可以去研究。這裡就不跑題了,這也是db2特有的)。
從定義中我們可以看出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。這就像一個使用者有一個預設的資料表空間,但是該使用者還可以使用其他的資料表空間,如果我們在建立對象時不指定資料表空間,則Object Storage Service在預設資料表空間中,要想讓Object Storage Service在其他資料表空間中,我們需要在建立對象時指定該對象的資料表空間。
總結:對oracle 來說,使用者就是模式。模式就是使用者。(以上全是廢話)。
(四)許可權。一個使用者權限由系統許可權。和使用者物件許可權組成。
1.系統許可權:
系統許可權包括:(由於太多,為了文章的篇幅所以只把查詢語句提供。你提供具體的系統全部許可權了)
SQL> select distinct PRIVILEGE from dba_sys_privs order by PRIVILEGE;
與系統許可權相關的視圖:
dba_sys_privs(所有系統許可權)
user_sys_privs.(使用者擁有的系統許可權)。
使用者物件許可權:
一個模式建立的對象,或者其他模式賦予的並授予了管理勸降(adm)的對象。如:
grant select,insert ,update ,delete on table_name to schema_name.這樣就授予了一個使用者物件許可權。
與使用者權限相關的視圖。
user_tab_privs;(這世界上最噁心的試圖,初一看還以為就只針對錶的使用者權限,不然其實他包括過程,包體,函數,試圖等對象所有對象的使用者權限,真想把oracle 命名的那仁兄給閹了,浪費我寶貴的時間)。
如:SQL> select * from USER_TAB_PRIVS where GRANTOR='TESTDB' AND PRIVILEGE='EXECUTE';
系統許可權與使用者物件許可權的區別:
系統許可權是廣義的。是相對整個對象的。而使用者物件許可權他只針對單個或者,一些對象。
系統許可權例子:
grant create table to user.
使用者物件許可權例子:
grant select on table_name to schema_name;
與使用者物件許可權相關的試圖:
角色:
角色就是一些許可權的集合:
為了方便管理,我們把某些常用的許可權組織成一個集合。賦予角色。然後把角色賦予使用者。提高管理的效率。例如建立一個資料庫某個模式,某幾個使用者下的的唯讀使用者,可讀可插入使用者,等等。在實質生產中還是有很大的意義。
1.建立角色,不指定密碼:
create role testrole;
2.建立角色,指定密碼:
create role testrole identified by tanfufa;
3.修改角色:
alter role testrole identified by luqiaoling;
給角色授予許可權。
Grant select on t1 to testrole;
Grant select on t2 to testrole;
Grant select on t3 to testrole;
把角色賦予使用者:(特別說明,授予角色不是即時的。如下:)
grant testrole to testdb;
起用角色:給使用者賦予角色,角色並不會立即起作用。
1.角色不能立即起作用。必須下次斷開此次串連,下次串連才能起作用。
2.或者執行命令:有密碼的角色set role testrole identified by tanfufa 立即生效;
3.無密碼的角色:set role testrole;或set role all except rolename_withpassword.
把角色賦予角色,角色嵌套。
create role testrole1;
grant select on t1 to testrole1;
create role testrole2;
grant testrole1 to testrole2;
grant r2 to testdb;
角色管理:
與角色有關係的視圖:
所有角色:
select * from dba_roles;
目前使用者scott有哪些角色:
select * from session_roles;
查看使用者權限
1.查看所有使用者:
select * from dba_users;
select * from all_users;
select * from user_users;
2.查看使用者或角色系統許可權:
select * from dba_sys_privs;
select * from user_sys_privs;
3.查看使用者物件許可權:
select * from dba_tab_privs;
select * from all_tab_privs;
select * from user_tab_privs;
4.查看所有角色:
select * from dba_roles;
5.查看使用者或角色所擁有的角色:
select * from dba_role_privs;
select * from user_role_privs;
6. oracle使用者查看自己的許可權和角色
select * from user_tab_privs;
select * from user_role_privs;
7. sys使用者查看任一使用者的許可權和角色
select * from dba_tab_privs;
select * from dba_role_privs;
注意:
1、以下語句可以查看Oracle提供的系統許可權
select name from sys.system_privilege_map
2、查看一個使用者的所有系統許可權(包含角色的系統許可權)
建立角色模板:只舉一個例子。大家去觸類旁通。
唯讀使用者角色的建立的指令碼:
1.授予某模式下對象讀許可權給角色。
SET PAGESIZE 0
SET FEEDBACK OFF
SET VERIFY OFF
SPOOL s.sql
SELECT 'GRANT SELECT ON "' || u.object_name || '" TO &1;'
FROM user_objects u
WHERE u.object_type IN ('TABLE','VIEW','SEQUENCE')
AND NOT EXISTS (SELECT '1'
FROM all_tab_privs a
WHERE a.grantee = UPPER('&1')
AND a.privilege = 'SELECT'
AND a.table_name = u.object_name);
SPOOL OFF
-- Comment out following line to prevent immediate run @s.sql
SET PAGESIZE 14
SET FEEDBACK ON
SET VERIFY ON
2.為模式權限物件建立同意詞。
SET PAGESIZE 0
SET FEEDBACK OFF
SET VERIFY OFF
SPOOL temp.sql
SELECT 'CREATE SYNONYM "' || a.table_name || '" FOR "' || a.owner || '"."' || a.table_name || '";'
FROM all_tables a
WHERE NOT EXISTS (SELECT '1'
FROM user_synonyms u
WHERE u.synonym_name = a.table_name
AND u.table_owner = UPPER('&1'))
AND a.owner = UPPER('&1');
SPOOL OFF
-- Comment out following line to prevent immediate run
@temp.sql
SET PAGESIZE 14
SET FEEDBACK ON
SET VERIFY ON