oracle 11g系列 用戶管理實驗報告

Oracle 數據庫用戶管理

在數據庫中各種對象被以用戶(方案)的方式組織管理

在創建對象和訪問對象前,首先創建對象的擁有者---用戶

用戶有相關的屬性,有些必須明確設置,有些可以用默認值

下面是用戶的相關屬性

--用戶名

--口令

--默認表空間

--臨時表空間

--賬戶狀態

--空間配額

--概要文件

其中用戶名和口令是必須要設置的

數據庫當中的對象是一schema的方式組織管理的

數據庫當中存在哪些類型的對象

對象是放在user下,通常稱之爲用戶下的對象,又稱作schema。

模式對象指的就是用戶下的對象。例如要訪問SCOTT用戶下的emp表,使用sys用戶去訪問----就是這樣描述scott.emp,該用戶下的所有對象必須是指定相應的用戶纔可以訪問,不能直接訪問,除非就在當前的用戶下。

創建用戶的步驟如下:

1. 確定用戶對象在表空間上的分佈,從而確定表空間配額

2. 確定用戶的默認表空間和臨時表空間

3. 確定用戶的口令管理規則和資源閒置規則,設置profile

4. 創建用戶,設置口令,並設置用戶的其他屬性

5. 給用戶賦予必要的角色

6. 給用戶直接賦予其他的直接權限

創建用戶linda,指定密碼linda

Linda用戶的其他值是默認分配的。用戶視圖如下:

SQL> desc dba_users

Name Null? Type

----------------------------------------- -------- ----------------------------

USERNAME NOT NULL VARCHAR2(30)

USER_ID NOT NULL NUMBER

PASSWORD VARCHAR2(30)

ACCOUNT_STATUS NOT NULL VARCHAR2(32)

LOCK_DATE DATE

EXPIRY_DATE DATE

DEFAULT_TABLESPACE NOT NULL VARCHAR2(30)

TEMPORARY_TABLESPACE NOT NULL VARCHAR2(30)

CREATED NOT NULL DATE

PROFILE NOT NULL VARCHAR2(30)

INITIAL_RSRC_CONSUMER_GROUP VARCHAR2(30)

EXTERNAL_NAME VARCHAR2(4000)

PASSWORD_VERSIONS VARCHAR2(8)

EDITIONS_ENABLED VARCHAR2(1)

AUTHENTICATION_TYPE VARCHAR2(8)

查看LINDA用戶的默認屬性

SQL> select username,password,account_status,default_tablespace,temporary_tablespace from dba_users where username='LINDA';

USERNAME PASSWORD

------------------------------ ------------------------------

ACCOUNT_STATUS DEFAULT_TABLESPACE

-------------------------------- ------------------------------

TEMPORARY_TABLESPACE

------------------------------

LINDA

OPEN //帳號狀態是打開<允許登陸的意思> USERS //默認表空間是users

TEMP //默認臨時表空間

添加profile 字段

SQL> c/from/,profile from

1* select username,password,account_status,default_tablespace,temporary_tablespace ,profile from dba_users where username='LINDA'

SQL> /

USERNAME PASSWORD

------------------------------ ------------------------------

ACCOUNT_STATUS DEFAULT_TABLESPACE

-------------------------------- ------------------------------

TEMPORARY_TABLESPACE PROFILE

------------------------------ ------------------------------

LINDA

OPEN USERS

TEMP DEFAULT

如何查看默認的表空間

SQL> select * from database_properties where property_name like '%DEF%';

PROPERTY_NAME

PROPERTY_VALUE

DESCRIPTION

DEFAULT_TEMP_TABLESPACE //默認的臨時表空間就是TEMP

TEMP

Name of default temporary tablespace

DEFAULT_PERMANENT_TABLESPACE //默認的表空間

USERS

Name of default permanent tablespace

PROPERTY_NAME

PROPERTY_VALUE

DESCRIPTION

DEFAULT_EDITION

ORA$BASE

Name of the database default edition

DEFAULT_TBS_TYPE

SMALLFILE

PROPERTY_NAME

PROPERTY_VALUE

DESCRIPTION

Default tablespace type

如何去修改默認的表空間?,首先必須要存在一個表空間,創建一個users1的表空間

SQL> create tablespace users1 datafile '/opt/oracle/oradata/orcl/user1.dbf' size 100m autoextend on;

Tablespace created

修改用戶的默認表空間

SQL> alter database default tablespace users1;

Database altered.

查看是否修改用戶的默認表空間

SQL> select * from database_properties where property_name like '%DEF%';

PROPERTY_NAME

PROPERTY_VALUE

DESCRIPTION

DEFAULT_TEMP_TABLESPACE

TEMP

Name of default temporary tablespace

DEFAULT_PERMANENT_TABLESPACE

USERS1

Name of default permanent tablespace

PROPERTY_NAME

PROPERTY_VALUE

DESCRIPTION

DEFAULT_EDITION

ORA$BASE

Name of the database default edition

DEFAULT_TBS_TYPE

SMALLFILE

PROPERTY_NAME

PROPERTY_VALUE

DESCRIPTION

Default tablespace type

系統當中的默認值不建議修改,在改回去

SQL> alter database default tablespace users;

Database altered.

如何指定單個用戶的默認表空間,用戶xiaobai的默認表空間爲users1

SQL> create user xiaobai identified by xiaobai default tablespace users1;

User created.

如果不指定默認的表空間,則oracle就將users設爲默認表空間。

如何查看用戶的默認表空間

SQL> select username,default_tablespace from dba_users;

USERNAME DEFAULT_TABLESPACE

------------------------------ ------------------------------

MGMT_VIEW SYSTEM

SYS SYSTEM

SYSTEM SYSTEM

DBSNMP SYSAUX

SYSMAN SYSAUX

U1 USERS

LINDA USERS

XIAOBAI USERS1

OUTLN SYSTEM

關於臨時表空間

默認的臨時表空間:所有的用戶創建完之後使用哪個臨時表空間來存放排序的臨時數據,排序一般都是在內存中排序,如果內存中無法完成排序工作,就在臨時表空間中完成。

查看臨時表空間

SQL> desc database_properties

Name Null? Type

----------------------------------------- -------- ----------------------------

PROPERTY_NAME NOT NULL VARCHAR2(30)

PROPERTY_VALUE VARCHAR2(4000)

DESCRIPTION VARCHAR2(4000)

SQL> select property_name,property_value from database_properties where property_name like '%TEMP%';

PROPERTY_NAME

------------------------------

PROPERTY_VALUE

--------------------------------------------------------------------------------

DEFAULT_TEMP_TABLESPACE

TEMP

臨時表空間的管理

1. 如何建立臨時表空間

2. 如何指定排序的表空間

建立臨時表空間

SQL> create temporary tablespace temp1 tempfile '/opt/oracle/oradata/orcl/temp1.dbf' size 100m;

Tablespace created.

查看當前的臨時表空間都有哪些?

SQL> select name from v$tempfile;

NAME

/opt/oracle/oradata/orcl/temp01.dbf

/opt/oracle/oradata/orcl/temp1.dbf

查看當前的臨時表空間都有哪些?

SQL> select tablespace_name from dba_temp_files;

TABLESPACE_NAME

TEMP

TEMP1

如何建立臨時表空間組

SQL> create temporary tablespace temp3 tempfile '/opt/oracle/oradata/orcl/temp2.dbf' size 100m tablespace group tempteam;

Tablespace created.

查看臨時表空間組

確定用戶的口令管理規則和資源閒置規則,默認是使用default作爲資源概要文件。設置profile----用戶的安全管理

給用戶賦予必要的角色—在oracle中創建用戶之後,默認情況下是不能直接登陸的,必須賦予必要的權限或必要的角色或給用戶賦予其他直接的權限。

剛纔創建的用戶linda是無法登陸的

SQL> conn linda/linda

ERROR:

ORA-01045: user LINDA lacks CREATE SESSION privilege; logon denied

Warning: You are no longer connected to ORACLE.

爲用戶linda賦予create session權限。

SQL> conn /as sysdba

Connected.

SQL> grant create session to linda;

Grant succeeded.

SQL> conn linda/linda

Connected.

建立用戶時,應該賦予哪些角色給用戶呢?

SQL> conn /as sysdba

SQL> grant connect,resource to linda;

Grant succeeded.

使用linda用戶登陸

SQL> conn linda/linda

Connected.

SQL> create table xinxi (id number);

Table created.

SQL> insert into xinxi values(1);

1 row created.

SQL> commit;

Commit complete. //這是linda用戶就有了使用數據庫的基本權限了。

查詢當前用戶<linda>擁有的權限

SQL> select * from session_privs;

PRIVILEGE

----------------------------------------

CREATE SESSION

UNLIMITED TABLESPACE

CREATE TABLE

CREATE CLUSTER

CREATE SEQUENCE

CREATE PROCEDURE

CREATE TRIGGER

CREATE TYPE

CREATE OPERATOR

CREATE INDEXTYPE

10 rows selected.

查詢linda用戶擁有的角色

SQL> select * from session_roles;

ROLE

------------------------------

CONNECT

RESOURCE

修改用戶屬性

用戶大多數的屬性是可以被修改的,只有用戶名稱不能修改

修改用戶口令;

SQL> alter user linda identified by linda123;

User altered.

重新設置用戶的默認表空間和臨時表空間

SQL> conn /as sysdba

Connected.

SQL> SQL> alter user linda default tablespace system temporary tablespace temp;

User altered.

鎖定用戶賬戶linda

SQL> conn /as sysdba

Connected.

SQL> alter user linda account lock;

User altered.

用linda用戶連接,提示用戶已被鎖定

SQL> conn linda/linda123

ERROR:

ORA-28000: the account is locked

Warning: You are no longer connected to ORACLE.

SQL> select username,account_status from dba_users where username='LINDA';

USERNAME ACCOUNT_STATUS

------------------------------ --------------------------------

LINDA LOCKED

爲linda用戶解鎖

SQL> conn /as sysdba

Connected.

SQL> alter user linda account unlock;

User altered.

SQL> conn linda/linda123

Connected.

SQL>

使linda賬戶口令過期

SQL> conn /as sysdba

Connected.

SQL> alter user linda password expire;

User altered.

SQL> conn linda/linda123

ERROR:

ORA-28001: the password has expired

Changing password for linda

New password:

Retype new password:

Password changed

Connected.

刪除用戶

* 如果用戶不再需要,可以使用DROP命令刪除用戶 DROP USER linda;

* 如果用戶模式中包含了對象,則必須使用CASCADE子句,表示刪除用戶的同時刪除了用戶模式中包含的所有對象。

* 當前連接的用戶不能刪除

刪除linda用戶

SQL> drop user linda;

drop user linda

*

ERROR at line 1:

ORA-01922: CASCADE must be specified to drop 'LINDA'

提示必須使用CASCADE命令來刪除linda用戶

SQL> drop user linda cascade;

User dropped.

此時用戶linda下的所有schema都會被刪除,例如創建的xinxi表都會被刪除

ORACLE的權限

權限是用於確保數據安全性的,有兩種安全性保障需要通過權限提供:

* 系統安全

* 數據安全

爲了實現數據庫的安全性,oracle提供了兩種類型的用戶權限:

* 系統權限:使用戶在數據庫中能夠執行特定的任務。

* 對象權限:使用戶可以訪問和操作特定的對象。

爲了使用戶能夠具有某種權限,執行相應的任務,DBA可以通過GRANT命令將權限授予一個用戶或者一組用戶。DBA可以通過REVOKE命令將權限從用戶身上移走。

系統權限描述

* 用戶對數據庫作操作,首先需要具有相應的系統權限,沒有系統權限,用戶對數據庫根本無法訪問。

* 在系統權限中有一類包含any關鍵字的權限,這種權限代表用戶對所有用戶的模式對象中都有某個特定的權限

* 通常數據庫管理員sys和system具有較高的系統權限,能夠完成很多管理任務。例如:

---創建新的用戶

---刪除用戶

---創建表空間

---刪除日誌組

---給用戶賦予或移除權限等

系統權限的授予

一旦用戶被創建,DBA就需要給用戶授予特定的系統權限,授予系統權限的語法如下:

GRANT privilege [,privilege….]

TO user [,user | role ,public…]

[WITH ADMIN OPTION];

其中,with admin option選項可以將授予能力進一步傳遞下去。

通常一個用戶至少會有下面的一些系統權限:

---CREATE SESSION

---ALTER SESSION

---CREATE TABLE

---CREATE SEQUENCE

---CREATE VIEW

---CREATE PROCEDURE

---UNLIMITED TABLESPACE

以上權限都是由create connect ,resource角色定義出來的。

授予系統權限的例子

可以一次將多個權限授予用戶

GRANT GREATESESSION,CREATE TABLE,CREATESEQUENCE,CREATE VIEW,CREATEPROCEDURE,UNLIMITED TABLESPACE TO testuser;

可以在授予系統權限的同時將權限的授予能力賦給用戶, ALTER SESSION是系統權限,with admin option的意義是testuser用戶可以將alter session系統權限賦給其他用戶。

CRANT ALTER SESSION TO testuser WITH ADMIN OPTION;

系統權限的授予

Sysdba和sysoper是兩種特權身份,也代表了一系列特殊的權限,這些權限不能直接授予用戶,只能通過特權身份傳遞

Sysdba和sysoper着兩種身份所代表的權限如下:

SYSOPER

---STARTUP

---SHUTDOWN

---ALTER DATABASE OPEN |MOUNT

---ALTER DATABASE BACKUP CONTROLFILE TO

---RECOVER DATABASE

---ALTER DATABASE ARCHIVELOG

---RESTRICTED SESSION

SYSDBA:

---SYSOPER PRIVILEGES WITH ADMIN OPTION

---CREATE DATABASE

---ALTER TABLESPACE BEGIN/END BACKUP

---RECOVER DATABASE UNTIL

系統權限的回收

如果用戶不再需要某些系統權限,可以通過REVOKE命令從用戶上移除

系統管理員sys和system都具有移除權限的能力,另外具有admin option選項的用戶已可以移除系統權限

系統權限具有級聯授予,非級聯移除的特性。

移除系統權限的語法如下:

REVOKE {privilege [,privilege….]}

FROM {USER[,USER…]|role|public}

舉列:

SQL> create user testuser identified by test1;

User created.

SQL> grant connect,resource to testuser;

Grant succeeded.

SQL> grant alter session to testuser with admin option;

Grant succeeded.

SQL> create user testuser1 identified by test11;

User created.

SQL> conn testuser/test1

Connected.

SQL> grant alter session to testuser1; //testuser用戶給testuser1用戶授予alter session權限級聯授予

Grant succeeded.

SQL> grant connect,resource to testuser1;

grant connect,resource to testuser1

ERROR at line 1:

ORA-01031: insufficient privileges //提示testuser沒有足夠的權限授予

SQL> conn /as sysdba //使用sysdba或sysoper身份賦予testuser1權限。

Connected.

SQL> grant connect,resource to testuser1;

Grant succeeded.

如何查看oracle中的系統權限,這是在sysdba上看到的系統權限

SQL> select * from user_sys_privs;

用testuser用戶登陸

SQL> conn testuser/test1 //查看當前用戶的系統權限

Connected.

SQL> /

USERNAME PRIVILEGE ADM

TESTUSER ALTER SESSION YES

TESTUSER UNLIMITED TABLESPACE NO

查看系統當前用戶的role權限

SQL> select * from role_sys_privs;

ROLE PRIVILEGE ADM

------------------------------ ---------------------------------------- ---

RESOURCE CREATE SEQUENCE NO

RESOURCE CREATE TRIGGER NO

RESOURCE CREATE CLUSTER NO

RESOURCE CREATE PROCEDURE NO

RESOURCE CREATE TYPE NO

CONNECT CREATE SESSION NO

RESOURCE CREATE OPERATOR NO

RESOURCE CREATE TABLE NO

RESOURCE CREATE INDEXTYPE NO

9 rows selected.

從testuser用戶回收alter session權限

從SQL> conn /as sysdba

Connected.

SQL> revoke alter session from testuser;

Revoke succeeded

SQL> revoke alter session from testuser1;

Revoke succeeded.

從testuser1用戶回收role,此時testuser1只有建立會話的權限。

SQL> revoke resource from testuser1;

Revoke succeeded.

級聯授予權限,testuser具有級聯授權的能力,testuser將alter session權限授予testuser1用戶,同樣testuser用戶也可以回收授予權限的能力。

SQL> grant alter session to testuser with admin option;

Grant succeeded.

SQL> conn testuser/test1

Connected.

SQL> grant alter session to testuser1; //級聯授予權限

Grant succeeded.

SQL> revoke alter session from testuser1; //testuser有授予權限的能力也具有回收授予權限的能力

Revoke succeeded.

關於級聯授予權限需要注意的

創建兩個用戶分別是zhangsan和lisi

SQL> create user zhangsan identified by zhangsan;

User created.

SQL> create user lisi identified by lisi;

User created.

SQL> grant create session to zhangsan;

Grant succeeded.

SQL> grant create session to lisi;

Grant succeeded.

SQL> grant alter session to zhangsan with admin option;

Grant succeeded.

SQL> grant alter session to lisi;

Grant succeeded.

SQL> revoke alter session from lisi; //zhangsan具備授予權限的能力,也具備回收能力。

Revoke succeeded.

如果再將alter session權限賦給lisi用戶

SQL> grant alter session to lisi;

Grant succeeded.

SQL> conn lisi/lisi

Connected.

SQL> select * from session_privs;

PRIVILEGE

CREATE SESSION

ALTER SESSION

此時我使用sysdba的身份回收權限。

SQL> conn /as sysdba

Connected.

SQL> revoke alter session from zhangsan; //回收zhangsan用戶的alter session權限

Revoke succeeded.

此時,默認情況下lisi用戶的alter session權限還是存在的。

SQL> conn lisi/lisi

Connected.

SQL> select * from session_privs;

PRIVILEGE

CREATE SESSION

ALTER SESSION

SQL> conn zhangsan/zhangsan

Connected.

SQL> revoke alter session from lisi;

revoke alter session from lisi

ERROR at line 1:

ORA-01031: insufficient privileges

SQL> conn /as sysdba

Connected.

SQL> revoke alter session from lisi;

Revoke succeeded.

此時查看lisi用戶的權限時發現alter session權限沒有了。

SQL> conn lisi/lisi

Connected.

SQL> select * from session_privs;

PRIVILEGE

CREATE SESSION

權限的授予和回收必須是具備了sysdba或sysoper的系統權限的用戶纔可以授予,當然也包括DBA的role也可以。如果是授予系統權限時加了with admin option,這種用戶也具備權限的授予和回收能力。

小插曲

關於unlimited tablespace權限的一個小實驗

SQL> create user xiaoli identified by xiaoli;

User created.

SQL> grant connect,resource to xiaoli;

Grant succeeded.

SQL> select * from dba_role_privs a where a.grantee='XIAOLI';

GRANTEE GRANTED_ROLE ADM DEF

------------------------------ ------------------------------ --- ---

XIAOLI RESOURCE NO YES

XIAOLI CONNECT NO YES

SQL> select * from dba_sys_privs a where a.grantee='XIAOLI';

GRANTEE PRIVILEGE ADM

------------------------------ ---------------------------------------- ---

XIAOLI UNLIMITED TABLESPACE NO

SQL> revoke unlimited tablespace from xiaoli;

Revoke succeeded.

SQL> select * from dba_sys_privs a where a.grantee='XIAOLI';

no rows selected

SQL> create role prole1;

Role created.

SQL> grant unlimited tablespace to prole1;

Grant succeeded.

SQL> grant unlimited tablespace to xiaoli;

Grant succeeded.

SQL> select * from dba_sys_privs where grantee='PROLE1';

GRANTEE PRIVILEGE ADM

------------------------------ ---------------------------------------- ---

PROLE1 UNLIMITED TABLESPACE NO

SQL> select * from dba_sys_privs where grantee='XIAOLI';

GRANTEE PRIVILEGE ADM

------------------------------ ---------------------------------------- ---

XIAOLI UNLIMITED TABLESPACE NO

SQL> revoke resource from xiaoli;

Revoke succeeded.

SQL> select * from dba_sys_privs where grantee='XIAOLI';

no rows selected

SQL> grant resource to prole1;

Grant succeeded.

SQL> grant prole1 to xiaoli;

Grant succeeded.

SQL> select * from dba_role_privs a where a.grantee='XIAOLI';

GRANTEE GRANTED_ROLE ADM DEF

------------------------------ ------------------------------ --- ---

XIAOLI PROLE1 NO YES

XIAOLI CONNECT NO YES

SQL> select * from dba_sys_privs a where a.grantee='XIAOLI';

no rows selected

對象權限

對象權限是對某個特定對象的訪問權限

不同類型的對象具有不同的對象權限

管理員,對象的擁有者以及具有with grant option選項的用戶可以將對象權限授予其他人

用戶對自己擁有的對象具有所有的對象權限。

用戶xiaoli要訪問scott用戶下的emp表

SQL> conn xiaoli/xiaoli

Connected.

SQL> select * from scott.emp;

select * from scott.emp

*

ERROR at line 1:

ORA-00942: table or view does not exist

SQL> conn /as sysdba

Connected.

SQL> select * from scott.emp;

EMPNO ENAME JOB MGR HIREDATE SAL COMM

---------- ---------- --------- ---------- --------- ---------- ----------

DEPTNO

----------

7369 SMITH CLERK 7902 17-DEC-80 800

SQL> show user;

USER is "SYS"

SQL> grant select on scott.emp to xiaoli;

Grant succeeded.

SQL> conn xiaoli/xiaoli

Connected.

SQL> select * from tab;

no rows selected

SQL> select * from scott.emp;

EMPNO ENAME JOB MGR HIREDATE SAL COMM

---------- ---------- --------- ---------- --------- ---------- ----------

DEPTNO

----------

7369 SMITH CLERK 7902 17-DEC-80 800

20

查看當前用戶具備什麼樣的對象權限

SQL> desc user_tab_privs;

Name Null? Type

----------------------------------------- -------- ----------------------------

GRANTEE NOT NULL VARCHAR2(30)

OWNER NOT NULL VARCHAR2(30)

TABLE_NAME NOT NULL VARCHAR2(30)

GRANTOR NOT NULL VARCHAR2(30)

PRIVILEGE NOT NULL VARCHAR2(40)

GRANTABLE VARCHAR2(3)

HIERARCHY VARCHAR2(3)

SQL> select owner,table_name,privilege from user_tab_privs;

OWNER TABLE_NAME

------------------------------ ------------------------------

PRIVILEGE

----------------------------------------

SCOTT EMP

SELECT //對scott用戶的EMP表有查詢權限。

SQL> conn /as sysdba

Connected.

SQL> revoke select on scott.emp from xiaoli;

Revoke succeeded.

SQL> grant select on scott.emp to xiaoli with grant option;

Grant succeeded.

SQL> conn xiaoli/xiaoli;

Connected.

SQL> grant select on scott.emp to lisi;

Grant succeeded.

SQL> conn xiaoli/xiaoli;

Connected.

SQL> select * from scott.emp;

EMPNO ENAME JOB MGR HIREDATE SAL COMM

---------- ---------- --------- ---------- --------- ---------- ----------

DEPTNO

----------

7369 SMITH CLERK 7902 17-DEC-80 800

授予xiaoli和lisi用戶對scott.emp表具有insert,update權限

SQL> conn /as sysdba

Connected.

SQL> grant insert,update on scott.emp to testuser,lisi;

Grant succeeded.

給用戶只能更新emp表中的sal列,其他列不可以更新

SQL> grant update(sal) on scott.emp to xiaoli;

Grant succeeded.

SQL> conn xiaoli/xiaoli

Connected.

SQL> update scott.emp set sal=sal+1;

14 rows updated.

SQL> commit;

當用戶xiaoli去修改emp表中的comm列的時候,會失敗,原因是權限不足。

SQL> update scott.emp set comm=100 where ename='KING';

update scott.emp set comm=100 where ename='KING'

*

ERROR at line 1:

ORA-01031: insufficient privileges

如何查詢列的權限

SQL> desc user_col_privs;

Name Null? Type

----------------------------------------- -------- ----------------------------

GRANTEE NOT NULL VARCHAR2(30)

OWNER NOT NULL VARCHAR2(30)

TABLE_NAME NOT NULL VARCHAR2(30)

COLUMN_NAME NOT NULL VARCHAR2(30)

GRANTOR NOT NULL VARCHAR2(30)

PRIVILEGE NOT NULL VARCHAR2(40)

GRANTABLE VARCHAR2(3)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章