Oracle user,role,profile常規操作--用戶,權限,角色,配置文件
1 權限查詢
1查看所有用戶
SQL> select username,account_status,lock_date,expiry_date,default_tablespace from dba_users;
SQL> select * from all_users;--3 columns
SQL> select * from user_users;
2查看用戶系統權限
SQL> select * from dba_sys_privs;
SQL> select * from user_sys_privs;
3查看用戶對象權限
SQL> select * from dba_tab_privs;
SQL> select * from all_tab_privs;
SQL> select * from user_tab_privs;
4查看所有角色
SQL> select * from dba_roles;
5查看用戶所擁有的角色
SQL> select * from dba_role_privs where grantee='DBA';--查看某用戶擁有的角色
SQL> select * from user_role_privs; 當前用戶擁有的角色
6查看某個角色的具體權限
如grant connect,resource,create session,create view to TEST;
SQL> SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE='RESOURCE';
SQL> SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE='DBA';
7查看當前用戶的缺省表空間
SQL> select username,default_tablespace from user_users;
查看表空間使用情況
select a.file_id "FileNo",
a.tablespace_name "Tablespace_name",
a.bytes "Bytes",
a.bytes - sum(nvl(b.bytes, 0)) "Used",
sum(nvl(b.bytes, 0)) "Free",
sum(nvl(b.bytes, 0)) / a.bytes * 100 "%free"
from dba_data_files a, dba_free_space b
where a.file_id = b.file_id(+)
group by a.tablespace_name, a.file_id, a.bytes
order by a.tablespace_name;
2用戶解鎖
ORA-28000: the account is locked
現象:如果某用記登錄密碼輸錯,登錄幾次ORACLE數據庫,則該用戶可能被鎖住。
出現錯誤提示:ORA-28000: the account is locked。
原因:數據庫參數文件中設置了輸錯密碼的次數,登錄時當輸錯密碼的次數超過所設置的次數時,則鎖住該用戶。默認一般為10次。
輸錯密碼鎖住用戶的設計原因:防止惡意的密碼攻擊。
臨時解決:手工對用戶進行解鎖
SQL>alter user SCOTT account unlock;
根本解決方法:將允許嘗試的次數改大或者設置成為無限次
修改FAILED_LOGIN_ATTEMPTS
SQL> select * from dba_profiles where RESOURCE_NAME='FAILED_LOGIN_ATTEMPTS';
SQL> alter profile default limit failed_login_attempts 100;
修改為無限次嘗試--不建議
SQL> alter profile default limit failed_login_attempts unlimited;
alter user sys identified by "xxxx";
alter user HR account lock;
alter user HR password expire;
查詢相關的鎖
SELECT L.SESSION_ID SID,
S.SERIAL#,
L.LOCKED_MODE,
L.ORACLE_USERNAME,
L.OS_USER_NAME,
S.MACHINE,
S.TERMINAL,
O.OBJECT_NAME,
S.LOGON_TIME
FROM V$LOCKED_OBJECT L, ALL_OBJECTS O, V$SESSION S
WHERE L.OBJECT_ID = O.OBJECT_ID
AND L.SESSION_ID = S.SID
ORDER BY SID, S.SERIAL#;
v$locked_object 視圖中記錄了所有session中的所有被鎖定的對象信息。
v$session 視圖記錄了所有session的相關信息。
dba_objects 為oracle用戶對象及系統對象的集合,通過關聯這張表能夠獲取被鎖定對象的詳細信息。
v$locked_object中的LOCKED_MODE字段表示鎖的模式,oracle中鎖的模式有如下幾種:
0:none
1:null 空
2:Row-S 行共享(RS):共享表鎖,sub share
3:Row-X 行獨占(RX):用於行的修改,sub exclusive
4:Share 共享鎖(S):阻止其他DML操作,share
5:S/Row-X 共享行獨占(SRX):阻止其他事務操作,share/sub exclusive
6:exclusive 獨占(X):獨立訪問使用,exclusive
數字越大鎖級別越高, 影響的操作越多。
1級鎖有:Select,有時會在v$locked_object出現。
2級鎖有:Select for update,Lock For Update,Lock Row Share
select for update當對話使用for update子串打開一個游標時,所有返回集中的數據行都將處於行級(Row-X)獨占式鎖定,
其他對象只能查詢這些數據行,不能進行update、delete或select for update操作。
3級鎖有:Insert, Update, Delete, Lock Row Exclusive
沒有commit之前插入同樣的一條記錄會沒有反應, 因為后一個3的鎖會一直等待上一個3的鎖, 我們必須釋放掉上一個才能繼續工作。
4級鎖有:Create Index, Lock Share
locked_mode為2,3,4不影響DML(insert,delete,update,select)操作, 但DDL(alter,drop等)操作會提示ora-00054錯誤。
00054, 00000, "resource busy and acquire with NOWAIT specified"
// *Cause: Resource interested is busy.
// *Action: Retry if necessary.
5級鎖有:Lock Share Row Exclusive
具體來講有主外鍵約束時update / delete ... ; 可能會產生4,5的鎖。
6級鎖有:Alter table, Drop table, Drop Index, Truncate table, Lock Exclusive
--查某session 正在執行的sql語句,從而可以快速定位到哪些操作或者代碼導致事務一直進行沒有結束等
SELECT /*+ ORDERED */
sql_text
FROM v$sqltext a
WHERE (a.hash_value, a.address) IN
(SELECT DECODE(sql_hash_value, 0, prev_hash_value, sql_hash_value),
DECODE(sql_hash_value, 0, prev_sql_addr, sql_address)
FROM v$session b
WHERE b.sid = '233')/* 此處233 為SID*/
ORDER BY piece ASC;
--查進程.
select * from v$process ;
--查鎖
select * from v$lock;
--查鎖定的對象
select * from v$locked_object;
--查事務
select * from v$transaction;
--查session
select v.* from v$session v where machine='xxx' and username='xxx' and status='INACTIVE' order by last_call_et desc
--查dba_objects對象
select * from dba_objects;
where object_id = '14977'
--查鎖定的表
select t2.username,t2.sid,t2.serial#,t3.object_name,t2.OSUSER,t2.MACHINE,t2.PROGRAM,t2.COMMAND,t2.LAST_CALL_ET
from v$locked_object t1,v$session t2 ,dba_objects t3
where t1.session_id=t2.sid and t1.object_id = t3.object_id
order by t2.logon_time;
SELECT T.SID, T.SERIAL# FROM V$SESSION T WHERE T.SID = 11;
ALTER SYSTEM KILL SESSION 'sid,serial#';
Oracle 用戶、對象權限、系統權限
一、用戶與模式
用戶:對數據庫的訪問,需要以適當用戶身份通過驗證,並具有相關權限來完成一系列動作
SYS用戶,缺省始終創建,且未被鎖定,擁有數據字典及其關聯的所有對象
SYSTEM用戶,缺省始終創建,且未被鎖定,可以訪問數據庫內的所有對象
模式(schema):是某個用戶擁有所有對象的集合。具有創建對象權限並創建了對象的用戶稱為擁有某個模式
注意:創建數據庫對象(視圖,表等)的任一用戶都擁有一個以該用戶名稱開頭的模式,且被視為模式用戶
二、創建及修改用戶
條件:需要具有創建用戶的權限,如sys,system,sysdba,dba role等
語法:
CREATE USER user
IDENTIFIED {BY password | EXTERNALLY | GLOBALLY AS external name }
[DEFAULT TABLESPACE tablespace_name]
[TEMPORARY TABLESPACE tablespace_name]
[QUOTA {n {[K|M] | UNLIMITED } ON tablespace_name
QUOTA {n {[k|M] | UNLIMITED } ON tablespace_name ... ]
[PASSWORD EXPIRE]
[ACCOUNT { LOCK | UNLOCK }]
[PROFILE { profile_name | DEFAULT }]
SQL> create user TEST identified by TEST DEFAULT TABLESPACE TEST;
--省略了DEFAULT TABLESPACE和TEMPORARY TABLESPACE 時,則由database_properties中對應的參數確定
SELECT property_name,property_value FROM database_properties WHERE property_name LIKE 'DEFAULT%';
1.修改用戶
SQL> alter user test account lock;
2.修改密碼
DBA 可以創建用戶和修改密碼
用戶本人可以使用ALTER USER 語句修改密碼
SQL> alter user test identified by "test123456";
3.刪除用戶:
SQL> drop user test;
CASECADE 連同用戶創建的對象一並刪除,如果該用戶創建了對象,要加CASCADE刪除,否則刪除不掉,另外,不能刪除當前正在與ORACLE服務器相連的用戶。
4.改變用戶在表空間上的配額:
SQL> alter USER test QUOTA UNLIMITED ON test;
SQL> alter USER HR QUOTA 30M ON YYHHQQ;
5.查看用戶表空間配額(dba_ts_quotas):
SQL> SELECT USERNAME,TABLESPACE_NAME,MAX_BYTES/1024/1024"MaxMB" FROM dba_ts_quotas WHERE USERNAME ='TEST';
6.查看特定對象下用戶所擁有的對象
使用dba_objects視圖
SQL> SELECT owner,object_name,object_type FROM dba_objects WHERE owner = 'BOL';
三、ORACLE權限:
系統權限: 允許用戶執行特定的數據庫動作,如創建表、創建索引、連接實例等
對象權限: 允許用戶操縱一些特定的對象,如讀取視圖,可更新某些列、執行存儲過程等
1.系統權限
超過一百多種有效的權限(SELECT * FROM SYSTEM_PRIVILEGE_MAP查)
數據庫管理員具有高級權限以完成管理任務,例如:
–創建新用戶
–刪除用戶
–刪除表
–備份表
a.常用的系統權限:
CREATE SESSION 創建會話
CREATE SEQUENCE 創建序列
CREATE SYNONYM 創建同名對象
CREATE TABLE 在用戶模式中創建表
CREATE ANY TABLE 在任何模式中創建表
DROP TABLE 在用戶模式中刪除表
DROP ANY TABLE 在任何模式中刪除表
CREATE PROCEDURE 創建存儲過程
EXECUTE ANY PROCEDURE 執行任何模式的存儲過程
CREATE USER 創建用戶
DROP USER 刪除用戶
CREATE VIEW 創建視圖
b.授予用戶系統權限
GRANT privilege [, privilege...] TO user [, user| role, PUBLIC...]
[WITH ADMIN OPTION];
PUBLIC 所有用戶
WITH ADMIN OPTION 使用戶同樣具有分配權限的權利,可將此權限授予別
SQL> create user scott identified by "scott";
SQL> GRANT UNLIMITED TABLESPACE TO TEST;
SQL> grant CREATE SESSION,CREATE TYPE,CREATE USER to scott;
SQL> grant execute any procedure to scott with admin option;
--scott具有WITH ADMIN OPTION,故可以將EXECUTE ANY PROCEDURE授予TEST
c.使用系統權限
--使用TEST具有創建會話、創建表
SQL> create table tb1 as select *from user_tables; --下面提示沒有權限在users表空間創建對象
[Error] Execution (1: 34): ORA-01031: 權限不足
SQL> select * from user_sys_privs;
d.查看系統權限
dba_sys_privs --針對所有用戶被授予的系統權限
user_sys_privs --針對當前登陸用戶被授予的系統權限
SQL> SELECT grantee,privilege,admin_option FROM dba_sys_privs
WHERE grantee IN ('SCOTT','ROBINSON')
ORDER BY grantee;
它卻具有兩個系統級權限:UNLIMITED TABLESPACE和CREATE PUBLIC SYNONYM。
e.回收系統權限
REVOKE {privilege | role} FROM {user_name | role_name | PUBLIC}
revoke UNLIMITED TABLESPACE from scott
--下面的示例中並沒有回收掉原來由scott授予給robisnon EXECUTE ANY PROCEDURE 的權限
SQL>REVOKE EXECUTE ANY PROCEDURE FROM SCOTT;
注意:對於使用with admin option 為某個用戶授予系統權限,那么對於被這個用戶授予相同權限的所有用戶來說,取消該用戶的系統權限並不會級聯取消這些用戶的相同權限
2.對象權限
不同的對象具有不同的對象權限
對象的擁有者擁有所有權限
對象的擁有者可以向外分配權限
ORACLE一共有種對象權限
對象權限 表 視圖 序列 過程
修改(alter) √ √
刪除(delete) √ √
執行(execute) √
索引(index) √
插入(insert) √ √
關聯(references) √ √
選擇(select) √ √ √
更新(update) √ √
a.對象授權
GRANT object_priv|ALL [(columns)]ON object
TO {user|role|PUBLIC} [WITH GRANT OPTION];
ALL:所有對象權限
PUBLIC:授給所有的用戶
WITH GRANT OPTION:允許用戶再次給其它用戶授權
b.授予系統權限與授予對象權限的語法差異:
授予對象權限時需要指定關鍵字ON,從而能夠確定權限所應用的對象。對於表和視圖可以指定特定的列來授權。
--對象授權示例
SQL> grant execute on dbms_lock to SCOTT;
SQL> GRANT SELECT ANY TABLE TO SCOTT;
--向數據庫中所有用戶分配權限
SQL>GRANT SELECT ON dept TO PUBLIC;
c.查詢權限分配情況
數據字典視圖 描述
ROLE_SYS_PRIVS 角色擁有的系統權限
ROLE_TAB_PRIVS 角色擁有的對象權限
USER_TAB_PRIVS_MADE 查詢授出去的對象權限(通常是屬主自己查)
USER_TAB_PRIVS_RECD 用戶擁有的對象權限
USER_COL_PRIVS_MADE 用戶分配出去的列的對象權限
USER_COL_PRIVS_RECD 用戶擁有的關於列的對象權限
USER_SYS_PRIVS 用戶擁有的系統權限
USER_TAB_PRIVS 用戶擁有的對象權限
USER_ROLE_PRIVS 用戶擁有的角色
--查詢已授予的對象權限(即某個用戶對哪些表對哪些用戶開放了對象權限)
SQL>SELECT * FROM USER_TAB_PRIVS_MADE;
d.收回對象權限
使用REVOKE 語句收回權限
使用WITH GRANT OPTION 子句所分配的權限同樣被收回
REVOKE {privilege [, privilege...]|ALL}
ON object
FROM {user[, user...]|role|PUBLIC}
[CASCADE CONSTRAINTS];
CASCADE CONSTRAINTS 為處理引用完整性時需要
--收回權限示例
SQL>revoke select on emp from scott;
注意:如果取消某個用戶的對象權限,對於該用戶使用with grant option授予其它用戶相同權限來說,將級聯刪除這些用戶權限
e.其它
檢查DBA權限的用戶
SQL>select * from dba_role_privs where granted_role='DBA';
查看當前用戶具有的系統權限:
SQL>select * from session_privs;
四、總結
1.使用create user語句創建用戶,alter user語句修改用戶,其語法大致相同
drop user username [CASCADE] 會刪除用戶所擁有的所有對象及數據
2.系統權限允許用戶在數據庫中執行特定的操作,如執行DDL語句。
with admin option 使得該用戶具有將自身獲得的權限授予其它用戶的功能
但收回系統權限時,不會從其它帳戶級聯取消曾被授予的相同權限
3.對象權限允許用戶對數據庫對象執行特定的操作,如執行DML語句。
with grant option 使得該用戶具有將自身獲得的對象權限授予其它用戶的功能
但收回對象權限時,會從其它帳戶級聯取消曾被授予的相同權限
4.系統權限與對象權限授予時的語法差異為對象權限使用了ON object_name 子句
5. PUBLIC 為所有的用戶
6. ALL:對象權限中的所有對象權限
五、角色
角色是權限的一個集合,可以分配給一個用戶或者其他角色,但角色不能授予自己,也不能循環授予
常用的角色
dba,select_catalog_role,execute_catalog_role,connect,resource,scheduler_admin,public
1 創建不要密碼的角色
SQL> create role yhq_1314;
2 創建帶密碼的角色
SQL> CREATE ROLE yhq_11 IDENTIFIED BY yhq_11;
3創建一個需要使用外部標示的角色
SQL> CREATE ROLE yhq_113 IDENTIFIED EXTERNALLY;
4 創建后查看角色
SQL> SELECT role,password_required FROM dba_roles;
1 給角色授權
---賦予系統權限
SQL> grant create table,create view ,create session to yhq_1314 with admin option;
----賦予對象權限
SQL> grant select ,update,delete on scott.emp to yhq_1314;
---查看角色的系統權限
SQL>SELECT * FROM role_sys_privs WHERE role = 'YHQ_1314';
YHQ_1314 CREATE TABLE YES
YHQ_1314 CREATE VIEW YES
YHQ_1314 CREATE SESSION YES
----查看角色的對象權限
SQL SELECT * FROM role_tab_privs WHERE role = 'YHQ_1314';
YHQ_1314 SCOTT EMP SELECT NO
YHQ_1314 SCOTT EMP DELETE NO
YHQ_1314 SCOTT EMP UPDATE NO
2 取消角色的權限
1 取消角色的系統權限
SQL> REVOKE CREATE VIEW FROM YHQ_1314;
2 回收角色的對象權限
SQL> REVOKE UPDATE ON scott.emp FROM YHQ_1314;
1將角色賦予給用戶
--將角色yhq_1314賦予用戶scott,並且使用了with admin option選項
SQL> GRANT YHQ_1314 TO scott WITH ADMIN OPTION;
此時scott用戶可以把該角色授權給hr用戶
SQL> GRANT YHQ_1314 TO hr WITH ADMIN OPTION;
--查看角色授予給了那些用戶
SQL> SELECT * FROM dba_role_privs WHERE granted_role = 'YHQ_1314';
SCOTT YHQ_1314 YES YES
HR YHQ_1314 YES YES
SQL> SELECT * FROM dba_role_privs WHERE granted_role = 'DBA';--查看對哪些用戶賦予了dba(角色)的權限
SYS DBA YES YES
SYSMAN DBA NO YES
SCOTT DBA NO YES
SYSTEM DBA YES YES
--查看用戶擁有那些角色
SQL> SELECT * FROM user_role_privs;
--查看當前用戶擁有那些角色
SQL> SELECT * FROM session_roles;
2 取消用戶擁有的角色
SQL> revoke YHQ_113 from scott
在查看SELECT * FROM user_role_privs
對於使用了 with admin option賦予用戶的角色,回收scott的角色,不會影響hr的角色
SQL> revoke YHQ_1314 from scott
然后在hr下
SQL> SELECT * FROM user_role_privs
YHQ_1314是存在的
3 設置用戶的默認角色
SQL> alter user test default role dba;
4 激活和停止角色
--查看用戶擁有的所有角色
SQL> SELECT * FROM user_role_privs;
--查看當前用戶的權限
SQL> select * from session_privs;
--禁用所有角色
SQL> set role none
--啟用所有角色
SQL> set role all
---啟用一個角色
SQL> set role dba
SQL> set role yhq_11 identified by yhq_11;--對於有密碼的角色的啟用
5 刪除角色
SQL> DROP ROLE yhq_1314;
六 用戶配置文件
配置文件實現中幾類安全控制措施:
帳戶上鎖
資源限制
直接權限
角色權限
1 資源限制
在會話級可以設置的資源限制如下:
SESSION_PER_USER: 每個用戶所允許的並行會話數
CPU_PER_SESSION: 總共的CPU時間,其單位是%s
IDLE_TIME: 沒有活動的時間,單位是分鍾
CONNECT_TIME: 連接時間
LOGICAL_READS_PER_SESSION: 物理和邏輯讀的數據塊數。
SQL>CREATE PROFILE yhq_prof LIMIT
SESSIONS_PER_USER 8 --同一用戶可打開個會話(連接)
CPU_PER_SESSION 168000 --每個會話最多可以使用的CPU時間為個%s
LOGICAL_READS_PER_SESSION 21888 --每個會話最多可以讀個數據塊
CONNECT_TIME 180 --每個會話的連接時間最多為分鍾
IDLE_TIME 10 ; --每個會話的沒有活動時間不能超分鍾
SQL> CREATE PROFILE yhq_prof LIMIT
SESSIONS_PER_USER 8
CPU_PER_SESSION 168000
LOGICAL_READS_PER_SESSION 21888
CONNECT_TIME 180
IDLE_TIME 10 ;
2 口令限制
FAILED_LOGIN_ATTEMPTS 帳戶被鎖之前可以嘗試登錄失敗的次數
PASSWORD_LOCK_TIME 嘗試指定次數失敗后,賬戶被鎖的天數
PASSWORD_LIFE_TIME 口令的生命周期(可使用的天數)
PASSWORD_GRACE_TIME 口令過期之后第一次成功地使用原口令登錄后要改變口令的寬限天數
PASSWORD_REUSE_TIME 在一個口令可以重用之前的天數
PASSWORD_REUSE_MAX 在一個口令可以重用之前的最大變化數
PASSWORD_VERIFY_FUNCTION 在一個新的口令賦予一個用戶之前,要驗證口令的復雜性是否滿足安全要求的一個PL/SQL函數(該函數要sys用戶運行utlpwdmg.sql腳本來生成)
在執行utlpwdmg.sql腳本文件期間,ORACLE服務器將創建VERIFY_FUNCTION函數,並且使用如下的ALTER PROFILE 命令來修改luckly_prof概要文件:
SQL>ALTER PROFILE yhq_prof LIMIT
PASSWORD_LIFE_TIME 60
PASSWORD_GRACE_TIME 10
PASSWORD_REUSE_TIME 1800
PASSWORD_REUSE_MAX UNLIMITED
FAILED_LOGIN_ATTEMPTS 3
PASSWORD_LOCK_TIME 1/1440;
3 修改配置文件
SQL> alter profile yhq_prof limit idle_time 40;
4 將profile賦予用戶
SQL> create user yhq_test identified by oracle profile yhq_prof;
SQL> ALTER USER SCOTT PROFILE yhq_prof;
5刪除配置文件
SQL> drop profile yhq_prof;
如果一個概要文件已經賦予了用戶,那么在DROP PROFILE時要用CASCADE
無法刪除DEFAULT配置文件,也無法刪除MONITORING_PROFILE配置文件