用户管理

用户具有以下属性:

  • 用户名: 不能超过30位。不能包含特殊字符。必须用字符开头。用户名不区分大小写。
  • 认证方式: 最常见的是密码认证。
  • 默认永久表空间: 控制用户可以在哪个表空间里创建对象。
  • 默认临时表空间: 临时表空间没有配额限制。
  • 用户配置文件user profile: 一组密码限制策略。
  • 初始消费组: Oracle资源管理器所使用。
  • 账号状态: open, locked, expired。

Schema是用户所拥有的一组数据库对象的集合。Schema Object是schema中创建的任何对象(表、索引、同义词,视图,Database Link,序列、存储过程等)。

Oracle提供的管理员账号



SYS与SYSTEM是不能被删除的,在DBCA创建实例的时候为他们创建了密码。

可以为其他Oracle自带管理员账号解锁并重设密码。

SQL> alter user syskm identified by oracle account unlock;
User altered.

多租户下的公共账号与本地帐号

  • 公共账号COMMON USER

    公共账号将同步到所有的现有的和将来创建的PDB中。默认情况下,公共账号的名字必须使用C##开头,必须C##Admin。

    初始化参数COMMON_USER_PREFIX指定了公共账号、角色和配置文件Profile的前缀。

    创建公共账号,需要在CDB$ROOT或者APP$ROOT创建。使用CREATE USER,并且包含CONTAINER=ALL的子句。

公共账号可以使用同样的用户名和密码登录到所有的PDB。公共账号不能与任何存在于PDB的本地帐号重名。

  • 本地用户LOCAL USER

    本地用户只是在PDB中创建的用户。不能在CDB$ROOT或者APP$ROOT创建本地账号。

    登录到想要创建本地帐号的PDB中,使用CREATE USER创建本地帐号。
SQL> CREATE USER C##CDBADMIN IDENTIFIED BY oracle ACCOUNT UNLOCK CONTAINER=ALL;
User created. SQL> GRANT CREATE SESSION, DBA TO C##CDBADMIN CONTAINER=ALL;
Grant succeeded. SQL> CONN C##CDBADMIN/oracle@pdb1;
Connected. 查看用户创建的common user
SQL> SELECT USERNAME, CON_ID FROM CDB_USERS WHERE COMMON='YES' AND USERNAME LIKE 'C##%'; USERNAME CON_ID
------------------------------ ----------
C##FIDELIO 3
C##CDBADMIN 3

创建本地用户

SQL> CREATE USER pdb1_admin IDENTIFIED BY oracle
2 DEFAULT TABLESPACE users
3 TEMPORARY TABLESPACE temp
4 ACCOUNT UNLOCK; User created. SQL> GRANT CREATE SESSION ,DBA TO pdb1_admin;
Grant succeeded. SQL> conn pdb1_admin/oracle@pdb1
Connected. SQL> select username ,con_id from cdb_users where common='NO'; USERNAME CON_ID
------------------------------ ----------
PDBADMIN 3
HR 3
PDB1_ADMIN 3
SMITH 3
OPS$LEO 3

Schema Only Account

Schema Only Account实现以下功能:

  • Schema Only Account用户无法登录到实例。
  • 强制使用应用程序访问数据。
  • 无法在database link中使用schema only account连接数据库。
  • 使用NO AUTHENTICATION子句创建schema only account。
  • 管理特权可以分配到Schema only user,也可以撤销。

应用开发者可能需要只包含SCHEMA数据,但不需要登陆的账号。强制数据只能通过应用进行访问,避免手工登录到实例进行操作。可以通过ALTER USER来启用用户登录实例的功能。

使用CREATE USER ... NO AUTHENTICATION子句创建SCHEMA ONLY ACCOUNT。

通过查询DBA_USERS,可以查看用户的身份验证方式。SCHEMA ONLY ACCOUNT的AUTHENTICATION TYPE=NONE, 密码认证的用户的AUTHENTICATION TYPE=PASSWORD。

许多Oracle自带的Schema都是SHCEMA ONLY ACCOUNT,避免了管理员需要定期为用户修改密码,同样减少了这些用户使用默认密码的安全威胁。

验证用户

连接到实例的用户必须通过验证。

可用的验证方式:

  1. 密码验证
  2. 操作系统验证。
  3. 密码文件验证。
  4. 强认证,例如Kerberos验证。

系统特权用户必须使用操作系统认证或者密码文件认证或者强认证方式,无论数据库状态如何,都可以通过认证。

密码验证

设置密码的时候,可以将密码设置为立即过期,用户下次登陆的时候会提示更改密码。

密码不能超过30位,可以是任何字符,大小写敏感。

通过网络进行密码验证,密码会自动使用AES加密,对用户来说这个加密是透明的。

可以对用户设置密码策略,这是通过用户配置实现的(user profile)。

使用密码文件验证

可以为Oracle数据库实例或者ASM实例配置密码文件认证。密码文件存储公共或者本地管理员的用户名和密码。

DBCA创建数据库的过程中会创建密码文件。

设置初始化参数REMOTE_LOGIN_PASSWORDFILE。

为用户分配系统特权(Grant sysdba to mydba)。

Unix和Linux中,密码文件名为orapwORACLE_SID,存储在$ORACLE_HOME/dbs中。

Windows,密码文件名为PWD<ORACLE_SID>,存储在$ORACLE_HOME\database目录中。

SQL> select username, sysdba, sysoper, sysbackup, account_status, common, con_id
from v$pwfile_users; USERNAME SYSDB SYSOP SYSBA ACCOUNT_STATUS COMMON CON_ID
---------- ----- ----- ----- --------------- -------- ----------
SYS TRUE TRUE FALSE OPEN YES 0
SYSTEM TRUE TRUE FALSE OPEN YES 0
PDBADMIN TRUE FALSE FALSE OPEN NO 3

操作系统认证

Oracle Universal Installer安装的过程中,会在Linux创建一系列的用户组。每个用户组对应到Oracle的权限组。比如系统dba组映射为Oracle的sysdba。

如果操作系统用户不属于以下组,则不能使用操作系统认证登录Oracle实例。

属于这些用户组的用户,可以直接登录Oracle实例,而不需要输入用户名或密码。

可以不输入用户名和密码,指定AS后面的权限即可。
sqlplus / as sysdba
sqlplus / as sysoper 输入错误的用户名和密码一样可以连接。
[oracle@ol7-19c ~]$ sqlplus any/any as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Mon Jan 30 20:31:38 2023
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0 SQL>

如果使用操作系统认证,需要设置OS_AUTHENT_PREFIX初始化参数,来指定操作系统认证用户名的前缀,这个前缀的默认值是OPS$, 当操作系统用户leo登录时,Oracle会检查是否有一个OPS$LEO的用户存在,如果存在,则允许用户登录。

SQL> show parameter os_authent_prefix;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
os_authent_prefix string ops$

可以查询SESSION_PRIVS字典视图查看用户拥有的系统特权。

SQL> SELECT * FROM SESSION_PRIVS ORDER BY PRIVILEGE;

PRIVILEGE
----------------------------------------
ADMINISTER ANY SQL TUNING SET
ADMINISTER DATABASE TRIGGER
ADMINISTER RESOURCE MANAGER
ADMINISTER SQL MANAGEMENT OBJECT
ADMINISTER SQL TUNING SET
ADVISOR
ALTER ANY ANALYTIC VIEW
ALTER ANY ASSEMBLY
ALTER ANY ATTRIBUTE DIMENSION
ALTER ANY CLUSTER
...省略

表空间配额

配额是表空间允许用户使用的最大空间量。默认情况下,用户在所有的表空间都没有配额。

不能为用户在SYS, SYSAUX分配配额,也就是说只有SYS和SYSTEM才能操作这两个表空间。

也不需要为用户分配临时表空间和Undo表空间的配额,

分配表空间的三个选项

  • UNLIMITED 用户对某个表空间不受限制。
  • UNLIMITED TABLESPACE 用户在所有表空间不受限制。
  • VALUE 设置一个用户可用的值, K or M。
SQL> CONN leozhang/oracle@pdb1
Connected.
SQL> create table test (id number);
Table created. SQL> insert into test values(1);
insert into test values(1)
*
ERROR at line 1:
ORA-01950: no privileges on tablespace 'USERS' 给予用户在users表空间1000M配额
SQL> ALTER USER leozhang QUOTA 1000M ON users;
User altered. 给予用户在users表空间无限配额
SQL> ALTER USER leozhang QUOTA UNLIMITED ON users;
User altered. 给予用户在所有表空间的无限配额
SQL> GRANT UNLIMITED TABLESPACE TO leozhang;
Grant succeeded.

----未整理----

配置权限与角色

DBA_SYS_PRIVS查看用户和角色所拥有的系统权限。

SQL> create user itleo identified by oracle account unlock;
User created. SQL> grant manager to itleo;
Grant succeeded. SQL> grant drop any table to itleo;
Grant succeeded. SQL> select grantee, granted_role, admin_option from dba_role_privs where grantee='ITLEO'; GRANTEE GRANTED_ROLE ADM
-------------------- -------------------- ---
ITLEO MANAGER NO SQL> select grantee, privilege, admin_option from dba_sys_privs where grantee='ITLEO'; GRANTEE PRIVILEGE ADM
-------------------- ---------------------------------------- ---
ITLEO DROP ANY TABLE NO

DBA_ROLE_PRIVS查看赋给用户的角色, ADM代表用户有权将角色赋给其他用户。

SQL> select granted_role, admin_option from cdb_role_privs where grantee='PDBADMIN';

GRANTED_ROLE         ADM
-------------------- ---
PDB_DBA YES
DBA NO

ROLE_SYS_PRIVS查看付给角色的系统权限。

SQL> create role manager;
Role created. SQL> grant create session, create table, select any table to manager;
Grant succeeded. SQL> select role, privilege from role_sys_privs where role='MANAGER'; ROLE PRIVILEGE
-------------------- ----------------------------------------
MANAGER CREATE TABLE
MANAGER CREATE SESSION
MANAGER SELECT ANY TABLE

设置DEFAULT ROLE给用户

分配给用户的角色都是默认角色,默认是启用的。

SQL> select grantee, granted_role,default_role from dba_role_privs
2 where grantee='WHARTON'; GRANTEE GRANTED_ROLE DEF
-------------------- -------------------- ---
WHARTON SELECT_USER YES
WHARTON CONNECT YES

可以通过ALTER USER ... DEFAULT ROLE ...设置默认角色。

SQL> alter user wharton default role connect;
User altered. SQL> select grantee, granted_role,default_role from dba_role_privs
2 where grantee='WHARTON'; GRANTEE GRANTED_ROLE DEF
-------------------- -------------------- ---
WHARTON SELECT_USER NO
WHARTON CONNECT YES SQL> alter user wharton default role connect, select_user;
User altered. SQL> select grantee, granted_role,default_role from dba_role_privs
2 where grantee='WHARTON'; GRANTEE GRANTED_ROLE DEF
-------------------- -------------------- ---
WHARTON SELECT_USER YES
WHARTON CONNECT YES

用户可以使用set role来激活属于自己的角色。

SET ROLE 角色1, 角色2,角色3 这里没有列出的角色将会是禁用状态。

SQL> conn wharton/oracle@pdb1;
Connected.
SQL> show user;
USER is "WHARTON" SQL> set role connect;
Role set. SQL> select * from session_roles;
ROLE
--------------------------------------------------------------------------------
CONNECT SQL> set role connect, select_user;
Role set. SQL> select * from session_roles;
ROLE
--------------------------------------------------------------------------------
CONNECT
SELECT_USER

配置用户资源限制

Oracle通过PROFILE来控制用户资源消耗以及管理账户状态和密码过期设置。

RESOURCE_LIMIT初始化参数是TRUE的时候,profile才能进行资源限制。

SQL> show parameter resource_limit;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
resource_limit boolean TRUE

profile可以在common或者local级别创建。用户需要CREATE PROFILE的权限才能创建profile。



/u01/app/oracle/product/19.0.0/dbhome_1/rdbms/admin/utlpwdmg.sql 文件中关于密码的模板

ALTER PROFILE DEFAULT LIMIT

PASSWORD_LIFE_TIME 180 #密码有效期180天

PASSWORD_GRACE_TIME 7 #超过有限期后有7天宽限期

PASSWORD_REUSE_TIME UNLIMITED

PASSWORD_REUSE_MAX UNLIMITED

FAILED_LOGIN_ATTEMPTS 10 #10次不成功的登陆锁定密码

PASSWORD_LOCK_TIME 1 #密码锁定1天

INACTIVE_ACCOUNT_TIME UNLIMITED

PASSWORD_VERIFY_FUNCTION ora12c_verify_function;

将上面的语句提取出来后,修改:

CREATE PROFILE PDB1_PROFILE LIMIT

PASSWORD_LIFE_TIME 90

PASSWORD_GRACE_TIME 7

PASSWORD_REUSE_TIME UNLIMITED

PASSWORD_REUSE_MAX UNLIMITED

FAILED_LOGIN_ATTEMPTS 4

PASSWORD_LOCK_TIME 1

INACTIVE_ACCOUNT_TIME UNLIMITED

PASSWORD_VERIFY_FUNCTION ora12c_verify_function;

使用system链接到PDB1,将上面的语句贴入。

[oracle@ol7-19c ~]$ sqlplus system/oracle@pdb1

SQL> CREATE PROFILE PDB1_PROFILE LIMIT
PASSWORD_LIFE_TIME 90
PASSWORD_GRACE_TIME 7
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX UNLIMITED
FAILED_LOGIN_ATTEMPTS 4
PASSWORD_LOCK_TIME 1
INACTIVE_ACCOUNT_TIME UNLIMITED
9 PASSWORD_VERIFY_FUNCTION ora12c_verify_function; Profile created.

应用Profile到用户。

SQL> ALTER USER itleo PROFILE pdb1_profile;
User altered.

创建common profile

CREATE PROFILE C##CDB_PROFILE LIMIT

PASSWORD_LIFE_TIME 90

PASSWORD_GRACE_TIME 7

PASSWORD_REUSE_TIME UNLIMITED

PASSWORD_REUSE_MAX UNLIMITED

FAILED_LOGIN_ATTEMPTS 4

PASSWORD_LOCK_TIME 1

INACTIVE_ACCOUNT_TIME UNLIMITED

PASSWORD_VERIFY_FUNCTION ora12c_verify_function container=all;

SQL> alter session set container=cdb$root;
Session altered. SQL>
CREATE PROFILE C##CDB_PROFILE LIMIT
PASSWORD_LIFE_TIME 90
PASSWORD_GRACE_TIME 7
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX UNLIMITED
FAILED_LOGIN_ATTEMPTS 4
PASSWORD_LOCK_TIME 1
INACTIVE_ACCOUNT_TIME UNLIMITED
9 PASSWORD_VERIFY_FUNCTION ora12c_verify_function container=all; Profile created. 应用c##cdb_profile到pdb1的Frank用户。
SQL> alter user frank profile c##cdb_profile;
User altered.

SQLDeveloper管理profile

  1. 查看pdb1的pdbadmin的profile是default。

  2. 创建一个HR_Profile

  3. 查看初始化参数 Resource_Limit,默认是True。

  4. 在SQLPLUS中,通过DBA_PROFILES查看Profile的设置。

SQL> SELECT PROFILE, RESOURCE_NAME, LIMIT FROM DBA_PROFILES
2 WHERE PROFILE='HR_PROFILE'; PROFILE RESOURCE_NAME LIMIT
-------------------- -------------------------- ---------------
HR_PROFILE COMPOSITE_LIMIT DEFAULT
HR_PROFILE SESSIONS_PER_USER DEFAULT
HR_PROFILE CPU_PER_SESSION DEFAULT
HR_PROFILE CPU_PER_CALL DEFAULT
HR_PROFILE LOGICAL_READS_PER_SESSION DEFAULT
HR_PROFILE LOGICAL_READS_PER_CALL DEFAULT
HR_PROFILE IDLE_TIME 15
HR_PROFILE CONNECT_TIME DEFAULT
HR_PROFILE PRIVATE_SGA DEFAULT
HR_PROFILE FAILED_LOGIN_ATTEMPTS DEFAULT
HR_PROFILE PASSWORD_LIFE_TIME DEFAULT PROFILE RESOURCE_NAME LIMIT
-------------------- -------------------------- ---------------
HR_PROFILE PASSWORD_REUSE_TIME DEFAULT
HR_PROFILE PASSWORD_REUSE_MAX DEFAULT
HR_PROFILE PASSWORD_VERIFY_FUNCTION DEFAULT
HR_PROFILE PASSWORD_LOCK_TIME DEFAULT
HR_PROFILE PASSWORD_GRACE_TIME DEFAULT
HR_PROFILE INACTIVE_ACCOUNT_TIME DEFAULT 17 rows selected. 将HR用户应用到HR_PROFILE
ALTER USER HR PROFILE HR_PROFILE

HR用户空闲15分钟后自动断开

[oracle@ol7-19c ~]$ sqlplus hr/hr@pdb1

SQL*Plus: Release 19.0.0.0.0 - Production on Sat Feb 4 19:55:36 2023
Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved. Last Successful login time: Fri Jan 27 2023 11:30:31 +08:00 Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0 SQL>
SQL> desc dba_users;
ERROR:
ORA-02396: exceeded maximum idle time, please connect again
  1. 修改profile的INACTIVE_ACCOUNT_TIME为10天, 能看到ora-02377报错,通过oerr ora 2377查看报错的信息并修改为15天。
SQL> ALTER PROFILE HR_PROFILE LIMIT INACTIVE_ACCOUNT_TIME 10;
ALTER PROFILE HR_PROFILE LIMIT INACTIVE_ACCOUNT_TIME 10
*
ERROR at line 1:
ORA-02377: invalid profile limit INACTIVE_ACCOUNT_TIME SQL> ! oerr ora 2377
02377, 00000, "invalid profile limit %s"
// *Cause: A value of 0 or lower was specified for the limit.
// *Action: Specify a limit greater than 0. For password profile parameters,
// some additional restrictions apply:
// * For the INACTIVE_ACCOUNT_TIME profile parameter, the specified
// limit cannot be less than 15 days.
// * For the PASSWORD_GRACE_TIME profile parameter, 0 is allowed
// as a permissible value. SQL> ALTER PROFILE HR_PROFILE LIMIT INACTIVE_ACCOUNT_TIME 15; Profile altered.

最新文章

  1. [笔记]kubernetes 无法启动问题
  2. C# web 获取服务端cookie
  3. JAVA 使用POI导出数据格式为Execl
  4. Java中的的XML文件读写
  5. lintcode:两数组的交 II
  6. [置顶] 我的设计模式学习笔记------&gt;Java设计模式总概况
  7. http报文在网络中是明文传输的,所以不安全。HTtp必然来临
  8. IBM服务器 IMM日志收集
  9. 关于下拉框列表不可选择相同值的设置一:当前DOM不可选
  10. 使用dlib中的深度残差网络(ResNet)实现实时人脸识别
  11. 演进之美,越来越美:三分钟看尽 iOS 1 ~ iOS 8 的进化史
  12. Dynamics CRM项目实例之十:CRM 2015的捆绑销售在订单中的效果
  13. Java设置session超时(失效)的时间
  14. python五十四课——datetime模块
  15. [19/05/03-星期五] GOF23_模式总结
  16. VC++学习之多线程(2)
  17. php7.0编译安装
  18. BZOJ 1562 变换序列(二分图匹配)
  19. easyui grid 里的可编辑text 加清空图标
  20. monkey测试===Monkey测试结果分析(系列三)转

热门文章

  1. 从 B 站出发,用 Chrome devTools performance 分析页面如何渲染
  2. 三天吃透Java并发八股文!
  3. c++ sizeof详解
  4. 力扣(leetcode)题库0001-python3
  5. Veeva_001常见问题总结
  6. 网络图片转base64
  7. JDK下载很慢
  8. git修改远程分支
  9. 在sublime text 3中编译javascript
  10. 常用 包vue-clipboard2