oracle 19C容器数据库用户管理

目录

创建用户

在cdb$root中創建common 用戶

在應用容器下創建通用用戶

用户认证方式

密码认证

强认证(SSL加密协议)

密码文件认证

操作系统用户与数据库用户映射

操作系统认证

用户权限管理

系统权限

对象权限

角色

profile


创建用户

創建一個用戶需要指明:用户名字  用户认证方式,默认表空间,临时表空间,(uer profile)。用户所有对象的集合叫做模式。

在cdb$root中創建common 用戶

如果是CDB数据库:

pdb中创建的用户叫本地用户,CDB只能创建通用用户,通用用户存在于所有容器中。

SQL> show parameter prefix;-------这里指定了通用用户的前缀

NAME                                   TYPE     VALUE
------------------------------------ ----------- ------------------------------
common_user_prefix             string     C##
os_authent_prefix                  string     ops$
private_temp_table_prefix     string     ORA$PTT_

SQL> create user c##u1 identified by oracle;

User created.

SQL> GRANT CREATE SESSION TO C##u1 container=ALL;

Grant succeeded.


[oracle@19c ~]$ sqlplus C##U1/oracle@pdb1---------创建好之后连接数据库,可以连接到所有的容器数据库,这里如果连接不上就检查一下tns配置是否正确,监听有没有打开

SQL*Plus: Release 19.0.0.0.0 - Production on Thu Dec 28 12:22:21 2023
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

Last Successful login time: Thu Dec 28 2023 12:22:02 +08:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL> show con_name

CON_NAME
------------------------------
PDB1

在應用容器下創建通用用戶

CDB中还有一个容器叫应用容器(application  container)

在CDB$ROOT 下创建应用容器,应用容器下可以创建通用用户,应用容器下可以创建pdb,通用用户在这个应用容器下的所有容器存在。

SQL> CREATE PLUGGABLE DATABASE salescat as APPLICATION CONTAINER ADMIN USER salesadm IDENTIFIED BY oracle
  2  FILE_NAME_CONVERT=('pdbseed','salescat');------創建應用容器

Pluggable database created.

SQL> show pdbs

    CON_ID CON_NAME              OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
     2 PDB$SEED                         READ ONLY  NO
     3 PDB1                                   MOUNTED
     4 PDB2                                   MOUNTED
     5 SALESCAT                          MOUNTED
SQL> alter pluggable database salescat open;

Pluggable database altered.

SQL> alter session set container=salescat;

Session altered.

SQL> show pdbs

    CON_ID CON_NAME              OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
     5              SALESCAT              READ WRITE NO



SQL> CREATE PLUGGABLE DATABASE apppdb1
  2  ADMIN USER apppdb1adm IDENTIFIED BY oracle
  3  FILE_NAME_CONVERT=('pdbseed','salescat/apppdb1');-----在應用容器下創建应用pdb

Pluggable database created.

SQL> show pdbs

    CON_ID CON_NAME              OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
     5 SALESCAT                           READ WRITE NO
     6 APPPDB1                             MOUNTED
SQL> ALTER PLUGGABLE DATABASE APPLICATION sampleapp BEGIN INSTALL '1.0';-----因为只能在应用程序的安装、升级或打补丁时才能创建和修改公共对象,所以先创建应用程序,可以纸样理解,我们在应用程序中创建公用对象,然后再登录到相应的应用pdb,使用sync进行刷新同步,将公用对象刷新到这个应用pdb

Pluggable database altered.

SQL> CREATE USER app_u1 IDENTIFIED BY oracle CONTAINER=all;-----在應用容器下創建pdb通用用戶,注意应用容器的通用用户前面没有C##

User created.

SQL> GRANT CREATE SESSION TO app_u1 container=all;

Grant succeeded.

SQL> ALTER PLUGGABLE DATABASE APPLICATION sampleapp end install;-------结束这个应用容器

Pluggable database altered.

SQL> alter pluggable database apppdb1 open;

Pluggable database altered.

SQL> alter session set container=apppdb1;

Session altered.

SQL> ALTER PLUGGABLE DATABASE APPLICATION ALL SYNC;----登录apppdb1,同步所有应用程序,来实现 应用容器内的公共对象共享到 应用pdb 中

Pluggable database altered.

SQL> show pdbs

    CON_ID CON_NAME              OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
     6 APPPDB1              READ WRITE NO


[oracle@oracle19c ~]$ sqlplus app_u1/oracle@localhost:1521/salescat---------------登录到应用容器,在应用容器下面创建的用户不能登录CDB$root容器

SQL*Plus: Release 19.0.0.0.0 - Production on Sun Aug 13 23:57:21 2023
Version 19.3.0.0.0


[oracle@oracle19c ~]$ sqlplus app_u1/oracle@localhost:1521/apppdb1---------登录到应用容器下面的pdb容器

SQL*Plus: Release 19.0.0.0.0 - Production on Sun Aug 13 23:58:53 2023
Version 19.3.0.0.0

SQL> show user
USER is "APP_U1"

SQL> desc user_sys_privs;      
 Name                       Null?    Type
 ----------------------------------------- -------- ----------------------------
 USERNAME                        VARCHAR2(128)
 PRIVILEGE                        VARCHAR2(40)
 ADMIN_OPTION                        VARCHAR2(3)
 COMMON                         VARCHAR2(3)
 INHERITED                        VARCHAR2(3)

SQL> select * from user_sys_privs ;

USERNAME
--------------------------------------------------------------------------------
PRIVILEGE                 ADM COM INH
---------------------------------------- --- --- ---
APP_U1
CREATE SESSION                 NO  YES YES


 

用户认证方式

SQL> create user c##u2 no authentication;------创建一个不能登录的用户

User created.

密码认证

强认证(SSL加密协议)

密码文件认证

如果数据库还没有启动,现在我要登录到实例,那么就需要用到密码文件验证。

密码文件默认保存了 sys 用户以及密码,如果把 sysdba 权限授予普通用户,则普通用户的用户名以及密码也会保存到密码文件中。

将sys用户和sysbackup用户添加到密码文件中,因为orapwCDB文件已经存在,所以force=y

SQL> SELECT USERNAME,SYSDBA,SYSOPER,SYSASM,SYSBACKUP,SYSDG,SYSKM from v$pwfile_users;--------查看有哪些用户放入了密码文件

SQL>  select USERNAME,SYSDBA,SYSOPER,SYSASM,SYSBACKUP,SYSDG,SYSKM 
  2  from v$pwfile_users;

USERNAME
--------------------------------------------------------------------------------
SYSDB SYSOP SYSAS SYSBA SYSDG SYSKM
----- ----- ----- ----- ----- -----
SYS
TRUE  TRUE  FALSE FALSE FALSE FALSE

SYSBACKUP
FALSE FALSE FALSE TRUE    FALSE FALSE

[oracle@19c ~]$ sqlplus sys/oracle@CDB as sysdba-------然后我们就可以在数据库关闭的时候登录到数据库,然后启动数据库,前提条件是需要静态监听

SQL*Plus: Release 19.0.0.0.0 - Production on Thu Dec 28 13:23:02 2023
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startup
ORACLE instance started.

Total System Global Area  838858864 bytes
Fixed Size            9140336 bytes
Variable Size          507510784 bytes
Database Buffers      318767104 bytes
Redo Buffers            3440640 bytes
Database mounted.
Database opened.

SQL> grant sysdba to c##u1 container=all;-------授予普通用户sysbda的权限之后,该用户会自动添加到密码文件中

Grant succeeded.
SQL> select USERNAME,SYSDBA,SYSOPER,SYSASM,SYSBACKUP,SYSDG,SYSKM 
  2  from v$pwfile_users;

USERNAME
--------------------------------------------------------------------------------
SYSDB SYSOP SYSAS SYSBA SYSDG SYSKM
----- ----- ----- ----- ----- -----
SYS
TRUE  TRUE  FALSE FALSE FALSE FALSE

SYSBACKUP
FALSE FALSE FALSE TRUE    FALSE FALSE

C##U1
TRUE  FALSE FALSE FALSE FALSE FALSE

[oracle@19c dbs]$ sqlplus c##u1/oracle@cdb---------当普通用户被授予sysdba权限后可以永普通用户的身份登录数据库

SQL*Plus: Release 19.0.0.0.0 - Production on Thu Dec 28 14:52:48 2023
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

Last Successful login time: Thu Dec 28 2023 14:52:04 +08:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL> show user
USER is "C##U1"
SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT
SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
[oracle@19c dbs]$ sqlplus c##u1/oracle@cdb as sysdba----------也可以永sysdba的身份登录数据库

SQL*Plus: Release 19.0.0.0.0 - Production on Thu Dec 28 14:53:27 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> show user
USER is "SYS"

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT
 

操作系统用户与数据库用户映射

1.在非CDB数据库下创建和操作系统账号相关联的用户
SQL>  SHOW parameter OS_AUTHENT_PREFIX;--------查看创建相关联用户须有的前缀

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
os_authent_prefix             string     ops$
SQL> create user ops$cuug
  2  IDENTIFIED BY EXTERNALLY
  3  DEFAULT TABLESPACE USERS
  4  TEMPORARY TABLESPACE temp
  5  QUOTA 15m on USERS;

User created.

SQL> grant connect to ops$cuug;

Grant succeeded.

2.用户创建完成后需要在操作系统创建一个和用户一样的用户名cuug,然后声明变量就可以直接登录数据库了,不用输入用户密码

操作系统认证

如下说明只有用户属于dba组才可以使用操作系统登录

Oracle 安装之后默认启用操作系统验证,这种验证方式必须在 Oracle 服务器本机登录。如果以安装 Oracle 时的用户登录操作系统,那么此时在登录 Oracle 数据库时不需要任何验证。采用此种方式登录时,数据库不需要打开,监听也可以不启动。

以下就是切换到oracle用户,然后不需要输入密码就直接登录了,前提条件是oracle用户必须属于DBA组

[oracle@oracle19c ~]$ id
uid=1001(oracle) gid=1001(oinstall) groups=1001(oinstall),1002(dba) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[oracle@oracle19c ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Mon Aug 14 21:16:26 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> show user
USER is "SYS"
 

用户权限管理

系统权限


SQL> select * from user_sys_privs;----------查看用户有哪些权限


SQL> select  count(distinct privilege) from dba_sys_privs;-----查看当前数据库已经分配了多少系统权限

COUNT(DISTINCTPRIVILEGE)
------------------------
             240

SQL>  select grantee ,privilege from dba_sys_privs where grantee='C##U1';------查看给用户分配了哪些系统权限,直接给的权限才可以查到,如果权限是通过角色给的,这个视图时查不到的

GRANT PRIVILEGE
----- ----------------------------------------
C##U1 CREATE SESSION
SQL> select * from session_privs;----------它会返回当前会话用户拥有的所有权限信息。

PRIVILEGE
----------------------------------------
CREATE INDEXTYPE
CREATE OPERATOR
CREATE TYPE
CREATE TRIGGER
CREATE PROCEDURE
CREATE SEQUENCE
CREATE CLUSTER
SELECT ANY TABLE
CREATE TABLE
CREATE SESSION

10 rows selected.

sys 用户把 SELECT ANY TABLE 权限权限给 SCOTT 加上 ADMIN OPTION 选项,SCOTT 也把 相应权限和选项授权给 CUUG1,CUUG1 又把相应的权限和选项授权给 CUUG2。

验证:

Sys 用户把 SCOTT 用户 SELECT ANY TABLE 权限给收回,CUUG1 和 CUUG2 是否还有该权 限。(有)

CUUG2 是否可以把上一级 CUUG1 的 SELECT ANY TABLE 权限给收回?(能)

CUUG2 是否可以把 sys 用户的 SELECT ANY TABLE 权限给收回?(能)

CUUG2 是否可以把自己的 SELECT ANY TABLE 权限给收回?(能)

--------授权,加上WITH ADMIN OPTION 下一级用户可以取消上一级用户的权限,上一级用户可以取消下下及用户的权限,系统权限无级联。

对象权限

SQL> show user   
USER is "C##U1"
SQL> select * from test;

no rows selected


SQL> desc test
 Name                       Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                            NUMBER(10)

SQL> insert into test (id) values(1);
insert into test (id) values(1)
            *
ERROR at line 1:
ORA-01950: no privileges on tablespace 'USERS'-----这里报错说用户在表空间里面没有空间份额


SQL> insert into test (id) values(1);

1 row created.

SQL> select * from test;

    ID
----------
     1

SQL> show user
USER is "SYS"
SQL> select * from C##U1.test;

no rows selected
SQL> alter user C##U1-------给用户分配表空间份额
  2  quota 5m on USERS;

User altered.

--------授权,加上WITH FRANT OPTION ,对象权限级联

角色

什么是角色?

角色是一组权限的组合,在CDB容器数据库中,可以把角色理解成一个用户,在root容器下创建的角色只能是通用角色,给通用角色授权时,加上container=all就是该权限在所有容器中都生效,不加container=all就是只在root容器下生效。

在cdb$root下创建角色c##role,如果希望角色的权限在所有容器都管用就需要加上container=all

SQL>  create role C##ROLE1;

Role created.

SQL> grant select any table to c##role1 container=all;

Grant succeeded.


SQL> desc role_role_privs;
 Name                       Null?    Type
 ----------------------------------------- -------- ----------------------------
 ROLE                            VARCHAR2(128)
 GRANTED_ROLE                        VARCHAR2(128)
 ADMIN_OPTION                        VARCHAR2(3)
 COMMON                         VARCHAR2(3)
 INHERITED                        VARCHAR2(3)


SQL> GRANT RESOURCE TO C##ROLE1;-----把resource角色分配给c##role1角色

Grant succeeded.


SQL> select role,granted_role from role_role_privs where role='C##ROLE1';----代表把resource 角色分配给了c##role1角色

ROLE             GRANTED_ROLE
-------------------- --------------------
C##ROLE1         RESOURCE

SQL> select privilege from role_sys_privs where role='C##ROLE1';-----查看角色下面的权限

PRIVILEGE
----------------------------------------
SELECT ANY TABLE

SQL> select * from session_roles;-----查看当前会话中的角色

ROLE
--------------------------------------------------------------------------------
C##ROLE1
RESOURCE
SODA_APP


角色分为默认角色和非默认角色,默认角色用户登录时自动生效,可以通过 session_roles查看

非默认角色登录时不会自动生效,需要set role生效。

启用角色分为密码验证和非密码验证,如果时密码验证的角色oracle自动设置成非默认。

如何实现相同用户登录可以有不同的权限?

1.创建一个密码验证的角色

2.分配时为非默认

3.启用角色需要提供密码

实验:

SQL> show pdbs---------在pdb插拔数据库创建两个角色,分别授予不同的权限

CON_ID CON_NAME              OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
     3 PDB1               READ WRITE NO
SQL> CREATE ROLE r1_select;

Role created.
SQL> GRANT SELECT ANY TABLE TO r1_select;

Grant succeeded.

SQL> CREATE ROLE r2_update identified by oracle;

Role created.

SQL> GRANT UPDATE ANY TABLE TO r2_update;

Grant succeeded.

SQL> grant r1_select,r2_update to C##U1;

Grant succeeded.


SQL> SELECT GRANTEE ,GRANTED_ROLE,DEFAULT_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTEE='C##U1';------此时我们可以看到密码验证的角色r2_update 是非默认的,此时角色还没有生效

GRANTEE    GRANTED_RO DEF
---------- ---------- ---
C##U1       R1_SELECT  YES
C##U1       R2_UPDATE  NO

SQL> set role r2_update identified by oracle;----将密码验证的角色生效,这个命令执行之后会将其它生效的角色排除,只剩下这一个

Role set.

SQL> select * from session_roles;-------可以看到现在就只有这一个角色了

ROLE
--------------------------------------------------------------------------------
R2_UPDATE

SQL> SET ROLE R1_SELECT,R2_UPDATE IDENTIFIED BY oracle;-----可以执行这个命令使所有的角色都生效

Role set.

SQL> select * from session_roles;-----可以看到所有的角色都生效了

ROLE
--------------------------------------------------------------------------------
R1_SELECT
R2_UPDATE

profile

用户必须要有一个profile,有自定义的和默认的,如果没有给用户创建profile,oracle会自动创建一个profile,名字就叫default。这个默认的profile必须存在,不能删除。

创建容器数据库限制文件希望在所有容器生效,需要加上container=all

SQL> select username,default_tablespace,profile from dba_users where username='C##U1';------查看用户的默认profile

USERNAME         DEFAULT_TABLESPACE   PROFILE
-------------------- -------------------- --------------------
C##U1             USERS          DEFAULT

SELECT PROFILE,RESOURCE_NAME,RESOURCE_TYPE,LIMIT FROM DBA_PROFILES WHERE PROFILE='DEFAULT';--------查看默认的profile,KERNEL代表资源,PASSWORD代表密码

SQL> alter profile default limit idle_time 1;-------连接时间超过1分钟,会话就会被kill掉

Profile altered.
 

1.会话占用的cpu资源限制

2.会话调用CPU的次数限制

3.会话占用内存的时间

4.会话的空闲时间,如果一个连接连接之后没有做任何的操作

5.限制用户的并发会话个数

6.磁盘io资源限制

7.尝试登录几次失败以后锁定账户,账号被锁定的天数

8.账号在被锁定之前的非活跃天数

9.密码的老化和过期天数限制,可以设置宽限期限,如果到了指定时间没有修改密码可以设置宽限期,宽限时间从你时间过期后的第一次成功登录开始计算。

10.设定原来用过的密码要经过多少天以后才可以重新使用

11.原来用过的密码要经过多少次更换之后才可以重新使用

12.密码的复杂程度验证,密码的验证函数对sys用户不起作用

如果要对profile进行设置,要把resource_limit参数设置成true之后才会生效,这个参数默认为true。


 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值