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,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配置文件