天天看點

Oracle使用者角色權限管理

(一)什麼叫使用者(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。這就像一個使用者有一個預設的表空間,但是該使用者還可以使用其他的表空間,如果我們在創 建對象時不指定表空間,則對象存儲在預設表空間中,要想讓對象存儲在其他表空間中,我們需要在建立對象時指定該對象的表空間。

總結:對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.授予某模式下對象讀權限給角色。

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