文章 > Oracle > Oracle 19C之用户访问控制

Oracle 19C之用户访问控制

炎燚小寶 · 2023-08-08 407 Oracle
分享 收藏


1、用户、模式、登录角色


用户:使用SCOTT用户登陆数据库,用户就是SCOTT;

角色:SCOTT以什么身份登陆(Normal、 DBA、 SYSOPER),就是什么角色;

在SCOTT 用户下创建一张表T1,那么SCOTT 就是模式(因为表T1属于关系模式)对象,模式是数据库逻辑呈现方式;

用户与模式是一对一关系,可简单理解为用户就是模式。创建用户后会有对应的一套模式,模式下面去管理对象。

图片.png


登陆 sys 查看数据库有多少用户?

 

select username from dba_users;


2、用户默认表空间


    每个用户都会有自己的指定默认表空间,在创建任何数据库对象时(表、视图、索引等)数据都会保存在此表空间中,如果在创建用户的时候没有指定具体所属表空间,那么默认属于数据库级默认永久表空间(USERS),默认临时表空间(temp)。



1)查看数据库默认的表空间

 

 col PROPERTY_NAME for a30
 
 col PROPERTY_VALUE for a30
 
 select property_name,PROPERTY_VALUE from database_properties where property_name like 'DEFAULT%TABLESPACE';
PROPERTY_NAME                  PROPERTY_VALUE
------------------------------ ------------------------------
DEFAULT_PERMANENT_TABLESPACE   USERS
DEFAULT_TEMP_TABLESPACE        TEMP

--默认undo

SHOW PARAMETER UNDO_TABLESPACE
NAME                                 TYPE                             VALUE
------------------------------------ -------------------------------- ------------------------------
undo_tablespace                      string                           UNDOTBS1


2)查看数据库默认的临时表空间

 

SQL> select property_name,PROPERTY_VALUE from database_properties where property_name='DEFAULT_TEMP_TABLESPACE';

PROPERTY_NAME                  PROPERTY_VALUE
------------------------------ ------------------------------
DEFAULT_TEMP_TABLESPACE        TEMP


提问1:如何证明创建用户时不指定表空间,这个用户就会使用默认 USERS 表空间?

1)创建用户 aaa 且不指定默认表空间
SQL> create user aaa identified by aaa;

2)查看 AAA 用户所属的表空间
set linesize 1000
set pages 1000
col username for a30
select username,default_tablespace,TEMPORARY_TABLESPACE from dba_users where username='AAA';
USERNAME                       DEFAULT_TABLESPACE             TEMPORARY_TABLESPACE
------------------------------ ------------------------------ ------------------------------
AAA                            USERS                          TEMP
提问2:如何为用户指定表空间?
 
1) 创建一个新的表空间 TEST,大小10M
SQL> create tablespace test datafile '/opt/oracle/oradata/ORCLCDB/ORCLPDB1/test1.dbf'size 10m;

2)创建用户并指定默认表空间 TEST
create user bbb identified by bbb default tablespace test;

3) 查看 BBB 用户所属表空间
SQL> select username,default_tablespace,TEMPORARY_TABLESPACE from dba_users where username in('AAA','BBB');

4) 更改数据库默认表空间
SQL> alter database default tablespace test;

5) 更改用户默认表空间
SQL> alter user bbb default tablespace test;

6) 更改用户默认临时表空间
SQL>alter user app1 temporary tablespace temp_app1;

3、表空间配额

    表空间配额(QUOTA)是表空间为用户的对应所使用的空间量(容量),在建立用户时,需要考虑到用户表空间配额的限制。因为多个用户可以同时使用同一个表空间,如果不做任何限制,无限制的表空间配额可能会导致表空间不足甚至撑爆。


示例:表空间配额分配与回收

 

1)给用户aaa在表空间users上配额1M的空间
SQL> alter user aaa quota 1m on users;

2)给用户aaa在表空间users上配额无限空间
SQL>  alter user aaa quota unlimited on users;

3)收回用户aaa在表空间users配额限制
SQL> alter user aaa quota 0 on users;

提问:表空间配额被回收之后,还能插入数据吗?


注意:要创建表,用户首先要有create session和create table权限,而且要有在该表使用的表空间上的配额。临时表空间和 UNDO 表空间不能针对用户设置配额。


1) 查看某用户是否分配磁盘配额

 

 select tablespace_name,username,bytes/1024 as M from dba_ts_quotas where username='AAA';



**********************

实验:测试配额分配的场景

**********************

1)创建用户、授权、设置默认表空间
SQL> create user t1 identified by t1;
User created.

SQL> grant connect,resource to t1;
Grant succeeded.

SQL> alter user t1 default tablespace test;
User altered.

SQL> select username,default_tablespace,TEMPORARY_TABLESPACE from dba_users where username ='T1';
USERNAME                       DEFAULT_TABLESPACE             TEMPORARY_TABLESPACE
------------------------------ ------------------------------ ------------------------------
T1
                             TEST                           TEMP
2)在默认表空间TEST上创建表
SQL> create table t1(id int);
Table created.

提问:明明没有分配表空间配额,为什么没有报错?

3)在表T1中插入数据
SQL> insert into t1 values(1);
insert into t1 values(1)
            *
ERROR at line 1:
ORA-01950: no privileges on tablespace 'TEST'

提问:为什么报错?

4)给T1用户在TEST表空间上分配1M空间
SQL> alter user t1 quota 1m on test;
User altered.

5)再次插入数据
SQL> insert into t1 values(1);
1 row created.

SQL> commit;
Commit complete.


4、概要文件


作用是对用户访问数据库做一些限制。有几个要点:

  • 概要文件(profile)具有两个功能,一个是实施口令限制,另一个是限制会话可以占用的资源。

  • 始终要实施口令控制,而对于资源限制,则只有实例参数 RESOURE_LIMIT 为 TRUE时(默认是FALSE)才会生效

  • 系统自动使用概要文件,有一个默认的default profile,限制很松,作用较小。

  • 可以使用 create profile 为用户创建它自己的概要文件,没有说明的参数就从 defaultprofile 的当前版本中提取



1)查看默认profile参数

 

1、查看默认的profile参数
select * from dba_profiles where profile='DEFAULT';

2、查看用户默认的profile
select username,PROFILE from dba_users where username='APP1';


2)介绍一下profile里的参数

    Password_parameter 部分:

Failed_login_attempts:指定在帐户被锁定之前所允许尝试登陆的的最大次数。
Password_lock_time:在到达 Failed_login_attempts 后锁定账户的天数
Password_life_time:口令过期前的天数,口令在过期后仍可以使用,具体取决于Password_grace_time
Password_grace_time:口令过期(将生成更改口令的提示)后第一次成功登录后的天数,在此期间,旧口令仍然可用。
Password_reuse_time:可以重新使用口令前的天数
password_reuse_max:可以重新使用口令的次数
Password_verify_function:更改口令时运行的函数名,此函数一般用于检查新口令所需的复杂程度。

  

Resource_parameter 部分

 

Session_per_user:对同一个用户账户执行的并发登录数。
Cpu_per_session:在强制终止会话前,允许会话的服务器进程使用的 CPU 时间(厘秒)。
Cpu_per_call: 在强制终止某条 SQL 语句前,允许会话的服务器进程用于执行此语句的 CPU 时间。
Connect_time: 在强制终止会话前,会话的最长持续时间(分钟)。
Idle_time: 在强制终止会话前,允许会话处于闲置状态的最长时间(分钟)。
Logical_reads_per_session: 在强制终止会话前,会话可读取的块数(无论块在数据缓冲区还是磁盘)。
Logical_read_per_call: 在强制终止单个语句前,此语句可读取的块数(无论块在数据缓冲区还是磁盘)。
Private_sga: 对于通过共享服务器体系结构连接的会话,允许会话的会话数据在SGA 中占用的字节数(考点)。
Composite_limit:前面几个参数的加权和。


3) profile的管理

1、创建profile
create profile userapp limit Password_life_time 10;

2、修改profle
alter profile userapp limit FAILED_LOGIN_ATTEMPTS 10;

3、设置用户profile
alter user AAA profile userapp;

4、删除profile
DROP PROFILE userapp;

###补充:profile正在被使用,无法被删除,需要添加cascade参数,用户的profile会被调整为default
SYS@pdb2> DROP PROFILE userapp;
DROP PROFILE userapp
*
ERROR at line 1:
ORA-02382: profile USERAPP has users assigned, cannot drop without CASCADE

##cascade强制删除
SYS@pdb2> SYS@pdb2> DROP PROFILE userapp cascade;
Profile dropped.

SYS@pdb2> SYS@pdb2> select username,profile from dba_users where username='AAA';
USERNAME             PROFILE
-------------------- -----------------------------------------------------------------------------------------------------------
AAA                  DEFAULT


针对生产环境上配置的几个常用参数,实验验证

4)以Failed_login_attempts为例,期望用户在登录2次之后被琐

1)创建一个自定义概要文件 userapp
SQL> create profile userapp limit Password_life_time 30;
Profile created

2)查看 AAA 用户默认使用的 profile
SQL> select username,profile from dba_users where username='AAA';
USERNAME                       PROFILE
------------------------------ ------------------------------
AAA                            DEFAULT

3)将概要文件 userapp 分配给 aaa 用户加以限制
SQL> alter user AAA profile userapp;
User altered.

4)再次查看 AAA 用户默认使用的 profile
SQL> select username,profile from dba_users where username='AAA';
USERNAME                       PROFILE
------------------------------ ------------------------------
AAA                            USERAPP

5)新开一个窗口,尝试用 aaa 用户故意输错密码登陆两次
SQL> conn aaa/2323@pdb
ERROR:
ORA-01017: invalid username/password; logon denied
Warning: You are no longer connected to ORACLE.

SQL> conn aaa/2323@pdb
ERROR:
ORA-01017: invalid username/password; logon denied

SQL> conn aaa/2323@pdb
ERROR:
ORA-28000: The account is locked.

两次失败后,这时候 aaa 账户已被锁定,再次登陆的时候,即使输入正确密码也无法登陆。
SQL> conn aaa/aaa@pdb
ERROR:
ORA-28000: the account is locked

6)查看用户AAA的状态
SQL> alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';
Session altered.
SQL> select username,ACCOUNT_STATUS,LOCK_DATE from dba_users where username='AAA';
USERNAME                       ACCOUNT_STATUS                   LOCK_DATE
------------------------------ -------------------------------- -------------------
AAA                            LOCKED(TIMED)                    2023-06-29 00:39:08

7)登陆 sys 给 aaa 解锁
SQL> conn / as sysdba
Connected.
SQL> alter user aaa account unlock;
User altered.

8)删除概要文件 userapp
SQL> drop profile userapp cascade;

9)删除后,用户 aaa 又会绑定到 default profile
SQL> select username,profile from dba_users where username='AAA';
USERNAME                       PROFILE
------------------------------ ------------------------------
AAA                            DEFAULT


5)设置密码复杂度示例

 

1)创建profile
create profile PROF_MYPROFILE limit
SESSIONS_PER_USER        unlimited      --每个用户拥有的会话数不限。
PASSWORD_REUSE_TIME      60             --密码重用次数。
FAILED_LOGIN_ATTEMPTS     10            --失败可尝试登录次数10次。
PASSWORD_LIFE_TIME        180           --密码180天过期。
PASSWORD_GRACE_TIME       7             --最多可以延迟7天必须修改密码。
PASSWORD_REUSE_MAX        1             --密码只能重用一次。
PASSWORD_LOCK_TIME        1/48          --锁定时间30分钟。
IDLE_TIME                 4320          --空闲时间。
PASSWORD_VERIFY_FUNCTION verify_function_11G; --指定密码复杂度函数:最少8位,包含大写,小写,数字,特殊符号。

2)修改用户profile
SYS@pdb2> alter user apps profile PROF_MYPROFILE;
User altered.

3)修改用户密码
SYS@pdb2> alter user apps identified by oracle;
alter user apps identified by oracle
*
ERROR at line 1:
ORA-28003: password verification for the specified password failed
ORA-20000: password length less than 8 bytes

4)修改正确的密码
SYS@pdb2> alter user apps identified by oracle1234;
User altered.

5)取消密码复杂度
alter profile DEFAULT limit PASSWORD_VERIFY_FUNCTION null;

思考:如何创建一个监控用户,要求密码永不过期




5、系统权限


系统权限是针对 DATABASE 的相关权限,系统权限通常由 DBA 授予

查看 dba 系统权限

 

SQL> select distinct privilege from dba_sys_privs;


典型的系统权限:

  • DROP USER

  • CREATE USER

  • BACKUP ANY TABLE

  • SELECT ANY TABLE

  • CREATE ANY TABLE


用户需要的系统权限

  • CREATE SESSION

  • CREATE TABLE

  • CREATE SEQUENCE

  • CREATE VIEW

  • CREATE PROCEDURE


实验1:用户需要什么权限才能登录数据库

 

1)pdb下,sys用户创建一个用户ccc,不授予任何权限
SQL> create user ccc identified by ccc;
User created.

2)ccc用户尝试登录
SQL> conn ccc/ccc@pdb;
ERROR:
ORA-01045: user CCC lacks CREATE SESSION privilege; logon denied  -->登录失败

3)给ccc授予create session权限
SQL> grant create session to ccc;
Grant succeeded.

4)ccc用户登录成功
SQL> conn ccc/ccc@pdb;
Connected.


实验2:用户需要什么权限才能创建表

1)ccc用户尝试创建表
SQL> create table t1(id number);
create table t1(id number)
*
ERROR at line 1:
ORA-01031: insufficient privileges

2)sys用户授予create table权限
SQL> grant create table to ccc;
Grant succeeded.

3)ccc用户创建表成功
SQL>  create table t1(id number);
Table created.

CCC查看下自己有哪些系统权限:

 

SQL>  select * from session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
CREATE TABLE


这两个权限,就是SYS刚刚授予的


思考题:CREATE TABLE 与 CREATE ANY TABLE 区别?

SYS 用户授权 CREATE TABLE 给用户时,用户即可在自己的模式下创建表。

如果授权 CREATE ANY TABLE 给用户时,用户不仅可以在自己的模式下创建表,也可以在其他模式下创建表。

例如:授权 hr 用户 create any table 权限

SQL> grant create any table to hr;

在其他用户下去创建表

SQL> create table ccc.t2(name char(5));




6、对象权限


对象权限是针对 SCHEMA(用户)对象的权限

对象权限有 8 种: ALTER, DELETE, EXECUTE, INDEX, INSERT, REFERENCES,SELECT, UPDATE

用法:grant 权限 on 对象 to 用户;


查看用户所拥有的对象权限

 

select * from dba_tab_privs t where t.grantee='PRIV_TEST_USER'



比如:test1 用户下的 t1表,只能 test1来查(除 sys)。如果其他用户要查询,需要 test1的授权。

 

1) CCC用户尝试查询test1用户下的t1表
SQL> select * from test1.t1;
select * from test1.t1
                    *
ERROR at line 1:
ORA-00942: table or view does not exist

2)test1用户授予查询t1表权限给ccc
SQL> grant select on t1 to ccc;
Grant succeeded.

3) CCC用户查询test1用户下的t1表成功
SQL> select * from test1.t1;
        ID
----------
         1
         
4)test1用户从ccc回收查询t1表权限
SQL> revoke select on t1 from aaa;


关于select授权,扩展一个知识点

select on table和read on table区别
 
1)ccc用户可以加for update参数
SQL> select * from test1.t1 for update;
        ID
----------
         1
2)test1用户查询
SQL> select * from test1.t1 for update;
。。。hang住

3)确认此时有行琐
SQL> set line 200 pagesize 9999
SQL> col event for a50
SQL> Select inst_id,event,count(*) from gv$session where status='ACTIVE' and wait_class#<> 6 group by inst_id,event order by 1;
   INST_ID EVENT                                                COUNT(*)
---------- -------------------------------------------------- ----------
         1 SQL*Net message to client                                   1
         1 enq: TX - row lock contention 
                                       1
4)回收select权限,再授权read权限,发现无法for udpate
--test1用户执行
SQL> revoke select on t1 from ccc;
Revoke succeeded.
SQL> grant read on t1 to ccc;
Grant succeeded.
--ccc用户执行
SQL>  select * from test1.t1 for update;
 select * from test1.t1 for update
                     *
ERROR at line 1:
ORA-01031: insufficient privileges
SQL>  select * from test1.t1;
        ID
----------
         1


甚至也可以针对到列进行授权:

SQL> grant select,update(salary) on employees to aaa;

回收的时候不能针对列收回,应该 update 整个收回。





7、角色权限

角色权限的引入是为了简化权限的管理

Oracle 数据库中的预定义角色: CONNECT,RESOURCE,DBA 等

比如我们查看 AAA用户的己授予角色有哪些:

 

SQL> select * from session_privs;
PRIVILEGE
---------------------------
CREATE SESSION
UNLIMITED TABLESPACE
CREATE TABLE
CREATE CLUSTER
CREATE SEQUENCE
CREATE PROCEDURE
CREATE TRIGGER
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE

其中 CREATE SESSION 是通过 CONNECT 角色授权过来的,其他是通过RESOURCE 角色授权过来的。

比如新建用户 DDD,并授予 CONNECT 和 RESOURCE 角色,来查看是否和 SCOTT用户所包含的系统权限一致。

其中, UNLIMITED TABLESPACE 这个选项是针对所有表空间都可以无限制使用。所以建议收回此权限。



1)查看某个角色拥有的权限

 

--查看角色的对象权限
select * from role_tab_privs t where t.role='CONNECT' ;

--查看角色的系统权限
select * from role_sys_privs t where t.role='CONNECT' ;

思考题:能不能自己创建一个角色,然后授予connect,resource的权限?再将该角色授权给新用户?
 
参考
SQL> create role r1;
Role created.
SQL> grant connect,resource to r1;
Grant succeeded.
SQL> grant r1 to ccc;
Grant succeeded.



8、授权与回收


授权: GRANT 权限|角色 TO 用户

回收: REVOKE 权限|角色 FROM 用户

注意:可以回收角色,但是角色里面的系统权限是无法单独回收的,但里面有个特例,就是 UNLIMITED TABLESPACE,它可以单独收回处理,其他不能。



实验:用户角色中的权限能否单独回收

1) 测试从connect角色中回收CREATE SESSION权限

 

1)要看test1用户授权的权限
PRIVILEGE
----------------------------------------
CREATE SESSION
UNLIMITED TABLESPACE
CREATE TABLE
CREATE CLUSTER
CREATE SEQUENCE
CREATE PROCEDURE
CREATE TRIGGER
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE
SET CONTAINER
11 rows selected

2)查看用户授予的角色
SQL>  SELECT GRANTEE,GRANTED_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTEE ='TEST1';
GRANTEE                        GRANTED_ROLE
------------------------------ ------------------------------
TEST1                          CONNECT
TEST1                          RESOURCE

3) 用SYS用户尝试回收test1的CREATE SESSION
SQL> revoke CREATE SESSION from test1;  --》回收失败
revoke CREATE SESSION from test1
*
ERROR at line 1:
ORA-01952: system privileges not granted to 'TEST1'

--查看角色拥有的系统权限
select * from role_sys_privs t where t.role='CONNECT' ;

--查看角色拥有的对象权限
select * from role_tab_privs t where t.role='CONNECT' ;

因为系统权限是打包成角色授权给 test1用户的,所以无法针对里面单一的系统权限进行回收。




2) 针对 UNLIMITED TABLESPACE 可以单独回收

 

SQL> revoke unlimited tablespace from test1;
Revoke succeeded.


9、权限传递


9.1  系统权限级联

语法:

with admin option     针对系统权限级联授权


提问:级联授权的系统权限,如果回收了主用户的权限,其它用户的权限还在吗?


1)创建三个测试帐号
SQL> create user x identified by x;
User created.
SQL> create user y identified by y;
User created.
SQL> create user z identified by z;
User created.

sys用户授权create session给 X 用户
SQL> grant create session to x with admin option;
Grant succeeded.

登录x用户
SQL> conn x/x
Connected.

授权create session给y和z
SQL> grant create session to y;
Grant succeeded.
SQL> conn y/y
Connected.

因为授权给 Y 用户没有带 WITH 选项,所以 Y 只能顾自己,无法授权给别人
SQL> grant create session to z;
grant create session to z
*
ERROR at line 1:
ORA-01031: insufficient privileges

如果授权 Y 用户带了 WITH 选项,那么 Y 也可以把权限传递别人
SQL> conn x/x@pdb
Connected.

SQL> grant create session to y with admin option;
Grant succeeded.

SQL> conn y/y@pdb
Connected.

SQL> grant create session to z with admin option;
Grant succeeded.

现在回收 X 权限, X 将无法登陆,但不影响 Y 和 Z
SQL> revoke create session from x;
Revoke succeeded.

SQL> conn x/x
ERROR:
ORA-01045: user X lacks CREATE SESSION privilege; logon denied
Warning: You are no longer connected to ORACLE.

SQL> conn y/y
Connected.

SQL> conn z/z
Grant succeeded.



结论:除了X不能登录,Y和Z还是可以登录的,也就是系统权限不会级联回收


9.2  对象权限级联


语法:

with grant option     针对对象权限级联授权

1)pdb下sys用户执行
SYS@pdb> grant select on test1.t1 to x with grant option;
Grant succeeded.

2)授权成功后, X 可查看 test1 的 t1 表
sys@pdb> conn x/x@pdb
Connected.
Session altered.
X@pdb> select count(*) from test1.t1;
  COUNT(*)
----------
    1
         
3) 同样 X 也可以把查看权限授权其他人 Y
X@pdb> grant select on test1.t1 to y;
Grant succeeded.

4) 连接y用户可以查到
SYS@ORCLCDB> conn y/y@pdb
Connected.
Session altered.
Y@pdb> select count(*) from test1.t1;
  COUNT(*)
----------
      1
        
5)通过sys用户回收test1.t1表查询权限
SYS@pdb>  revoke select on test1.t1 from x;
Revoke succeeded.

6)回收权限后, X 和 Y 将都无法查看
X@pdb> select count(*) from test1.t1;
select count(*) from test1.t1
                           *
ERROR at line 1:
ORA-00942: table or view does not exist
Y@pdb> select count(*) from test1.t1;
select count(*) from test1.t1
                           *
ERROR at line 1:
ORA-00942: table or view does not exist



10、最小原则分配权限


•从PUBLIC中撤销不必要的权限

•使用acl (access control lists)控制网络访问

•限制对操作系统目录的访问

•限制具有管理权限的用户

•限制远程数据库认证

•启用统一审计


    为了使用DBMS_PRIVILEGE_CAPTURE包,您必须被授予CAPTURE_ADMIN角色。无论您试图监视什么,DBMS_PRIVILEGE_CAPTURE包的基本用法都是相同的。

  1. 创建特权分析策略。(CREATE_CAPTURE)

  2. 启用它。(ENABLE_CAPTURE)

  3. 等待所需的分析周期。

  4. 禁用特权分析策略。(DISABLE_CAPTURE)

  5. 分析结果。(GENERATE_RESULT和查询字典视图)

  6. 如果不再需要策略和记录的数据,请删除该策略。(DROP_CAPTURE)



11、PULIC用户

这个用户比较特殊,对它授予的权限,其它用户都会自动拥有


实验:在不给用户u1授权的情况下,让u1实现登录功能

SYS@pdb> create user u1 identified by u1;
User created.

2、用户u1登录失败,提示无权限
[oracle@database ~]$ sqlplus u1/u1@pdb
SQL*Plus: Release 19.0.0.0.0 - Production on Fri Jun 30 02:11:05 2023
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle.  All rights reserved.
ERROR:
ORA-01045: user U1 lacks CREATE SESSION privilege; logon denied
Enter user-name:

3、给public用户授权create session
SYS@pdb> grant create session to public;
Grant succeeded.

--查看public用户拥有的系统权限
SYS@pdb> SELECT GRANTEE,PRIVILEGE FROM DBA_SYS_PRIVS WHERE GRANTEE ='PUBLIC';
GRANTE PRIVILEGE
------ ----------------------------------------
PUBLIC CREATE SESSION

4)再次尝试登录u1,成功
[oracle@database ~]$ sqlplus u1/u1@pdb
SQL*Plus: Release 19.0.0.0.0 - Production on Fri Jun 30 02:13:31 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
Session altered.
U1@pdb>





点击加载更多