# user1_tbs表空间和user1_temp临时表空间需要提前创建好。
# 创建表空间user1_tbs
SQL> create tablespace user1_tbs
datafile '/u01/app/oracle/oradata/ORCL/datafile/user1.dbf' size 10M
autoextend on next 10M
maxsize 100M;
# 创建临时表空间user1_temp
SQL> create temporary tablespace user1_temp
tempfile '/u01/app/oracle/oradata/ORCL/datafile/user1_temp.dbf' size 10M;
# 创建user1用户
SQL> create user user1 identified by "123456"
default tablespace user1_tbs
temporary tablespace user1_temp;
注意:在创建用户时,不指定的情况下,默认表空间为USERS,临时表空间为TEMP
# 创建user2用户
SQL> create user user2 identified by "123456"
password expire;
# 刚创建的用户没有登录权限,需要有create seesion权限
grant create session to user2
# 测试登录user2
SQL> conn user2/123456
ERROR:
ORA-28001: the password has expired
Changing password for user2
New password: # 输入密码
Retype new password: # 再次输入密码
Password changed
Connected.
SQL> conn user2/1234 # 再次登录
Connected.
SQL> create user user3 identified by "123456"
default tablespace user3_tbs
temporary tablespace user3_temp
quota 10M on user3_tbs;
注意:
1、如果建立用户时没有为表空间指定QUOTA子句,那么用户在特定表空间上的配额为0,用户将不能在相应的表空间上建立数据对象。
2、要设置用户在指定表空间上不受限制,可以使用QUOTA UNLIMITED ON tablespace_name子句。
与用户相关的视图:
dba_users :可以查询数据库中所有用户信息
如果不知道查用户什么信息,可以先查看数据结构信息
SQL> desc dba_users;
SQL> select username,default_tablespace,temporary_tablespace
from dba_users;
SQL> select username,default_tablespace,temporary_tablespace
from dba_users
where username='USER1';
SQL> select username,account_status,expiry_date,last_login
from dba_users
where username='USER2';
select username,sysdba,sysoper,sysbackup
from v$pwfile_users;
SQL> alter user user2 identified by "1234";
# 锁定用户:将user2锁定
SQL> alter user user2 account lock;
# 连接登录时,显示账号被锁
SQL> conn user2/123456
ERROR:
ORA-28000: the account is locked
Warning: You are no longer connected to ORACLE.
# 注意:此时没有连接到用户,需要重新登录到sys用户
SQL> alter user user2 account unlock;
SP2-0640: Not connected
SQL> conn sys/xxx as sysdba
Connected.
# 解锁用户:将user2用户解锁
SQL> alter user user2 account unlock;
User altered.
# 连接成功
SQL> conn user2/123456
Connected.
SQL> alter user user1 password expire;
# 再次登录会发现密码过期,要求重新设置密码
SQL> conn user1/1234
ERROR:
ORA-28001: the password has expired
Changing password for user1
New password:
Retype new password:
Password changed
Connected.
# 将user1的默认表空间修改为liyb表空间
SQL> alter user user1 default tablespace liyb;
# 查看user1用户的默认表空间是否改变
SQL> select username,default_tablespace from dba_users where username ='USER1';
# 当用户配额消耗完,可以给用户添加配额
SQL> alter user user1 quota 100M on liyb;
# 查看表空间配额
SQL> SELECT tablespace_name, bytes/10.24/1024 as MB, max_bytes
FROM dba_ts_quotas
where tablespace_name='LIYB';
SQL> drop user liyb;
# CASCADE:级联删除
# 如果用户包含数据对象,则必须使用cascade进行删除
SQL> drop user xxx cascade;
用户创建之后并没有操作数据库的权限,仅表示该用户在Oracle上进行了注册。需要有操作权限,需要具有DBA权限的用户对其进行授权
系统权限:用户在数据库范围内能够执行某种操作,是在系统级对数据库进行存取和使用的机制。例如,用户是否能够连接到数据库系统(SESSION权限)上,以及是否能够执行系统级的DDL语句(如CREATE、ALTER和DROP)等。
对象权限:是指某一个用户对其他用户的表、视图、序列、存储过程、函数、包等进行操作的权限。不同类型的对象具有不同的对象权限,对于某些模式对象,如簇、索引、触发器、数据库链接等没有相应的实体权限,这些权限由系统权限进行管理。
刚创建的用户直接登录,会出现以下报错
SQL> conn user1/1234
ERROR:
ORA-01045: user USER1 lacks CREATE SESSION privilege; logon denied
Warning: You are no longer connected to ORACLE.
SQL> select name,privilege from system_privilege_map;
SQL> grant create session,create table,create view to user1;
SQL> grant create user,create session,create table,create view,create procedure to user2 with admin option;
with admin option:表示被授权者可以将权限再授予其他用户,如果被授权者将权限授予给另外一个用户后,自身的权限被回收,并不影响另外一个用户的权限。
# 将scott用户的emp表相关权限授权给user1
SQL> grant alter,excute,insert,update,select,delete on scott.emp to user1;
# 授权给user2同时,让其有授权给其他用户权限
SQL> grant alter,excute,insert,update,select,delete on scott.emp to user2
with grant option;
with grant option:可以将已拥有的权限授予其他用户。如果将权限授权给其他用户,权限被回收后,其他用户也无法使用该权限。
dba_users:数据库层面的用户基本信息,可以查所有用户信息
dba_sys_privs:已授予用户或角色的系统权限
user_sys_privs:当前用户所拥有的系统权限
dba_tab_privs:数据库的对象权限信息
user_tab_privs:当前用户所拥有的对象权限
user_tables:查看当前用户创建的所有表信息
all_tables:数据库上所有的表信息
# 在sys用户下查看user1具有的系统权限
SQL> select privilege from dba_sys_privs where grantee='USER1';
# 在当前用户下查看user2具有的系统权限
SQL> conn user2/123456
SQL> select privilege from user_sys_privs;
# 在sys用户下查看user1的对象权限
SQL> select table_name,owner,privilege from dba_tab_privs where grantee='USER1';
# 在user2用户下查看对象权限
SQL> conn user2/123456
SQL> select table_name,privilege from user_tab_privs;
SQL> revoke create session,create table,create view from user1;
SQL> revoke alter,excute,insert,update,select,delete on scott.emp from user1;
角色是一个独立的数据库实体,它包括一组权限。角色是权限的集合,角色可以被授予任何用户,也可以从任何用户收回。角色是用于简化权限的管理。
# 创建角色,不使用密码
SQL> create role role_1;
# 创建带有密码的角色
SQL> create role role_2 identified by "123456";
SQL> grant create session,create table to role_1;
SQL> grant create session,create table,create view to role_2;
SQL> grant role_1 to user1;
SQL> grant role_2 to user2;
与角色相关的数据字典:
dba_role_privs:数据库上所有用户的角色
role_sys_privs:当前用户所拥有的角色权限
# 在sys用户下看
SQL> select granted_role from dba_role_privs where grantee ='USER1';
# 进入user1用户,查看当前权限
SQL> select granted_role from user_role_privs ;
# 修改
SQL> alter role role_2 identified by "1234";
SQL> alter role role_2 not identified;
SQL> drop role role_1;