Oracle体系结构和用户管理
一、Oracle体系结构
数据库的体系结构是指数据库的组成、工作过程、以及数据库中数据的组织与管理机制。要了解oracle数据库的体系结构,必须理解oracle系统的主要组件和重要概念。
1、oracle体系结构总览
oracle体系结构包含一系列的组件。包括实例、用户进程、服务器进程、数据文件及其他文件,如参数文件、口令文件和归档日志文件等。如下图所示:
1)实例
oracle实例是后台进程和内存结构的集合,必须启动实例才能访问数据库中的数据。oracle实例启动时,将分配一个系统全局区(SGA)并启动一系列oracle后台进程。oracle实例有两种类型:单进程实例和多进程实例。单进程oracle实例使用一个进程执行oracle的全部操作,在单进程oracle实例仅允许一个用户可存取。多进程oracle实例(又被称为多用户oracle)使用多个进程来执行来执行oracle的不同部分,对于每个连接的用户都有一个进程。
2)数据库
数据库是数据的集合,物理上是指存储数据库信息的一组操作系统文件,每个数据库都有一个逻辑结构和一个物理结构。物理结构是指构成数据库的一组操作系统文件,主要由三种类型文件组成:数据文件、控制文件和重做日志文件。数据库的逻辑结构是指数据库数据的逻辑存储结构(如表空间、段、区等)和模式对象(如表、视图等。)
注:oracle中的表空间,就类似于MySQL、SQL server中“库”的概念,库中有表、表中有数据。
3)可插拔数据库
从oracle 12c版本开始,oracle引入了可插拔数据库的概念,可插拔是为云计算而生。可插拔的结构是由一个容器数据库(CDB)和若干个可组装数据库(PDB)组成,每个PDB对外可充当一个独立的数据库供应用程序使用,它可以包含自己的数据文件,但是所有的PDB共享CDB的控制文件和日志文件。所谓可插拔,意味着PDB可以像USB一样随时插入CDB中,不用也可以随时拔下来。一个CDB中最多可以插入250个PDB,在PDB中,seed PDB为模板PDB,它为新创建的PDB提供模板。其他的PDB可以根据需要创建、删除。可插拔功能可以加入数据库的部署,给一个CDB打补丁就可以将所有的更新同步到其上的所有PDB中。
在oracle 12c之前的版本,实例和数据库只能是一对一或多对一(RAC,实时应用群集)的关系,就是说,只能是一个实例对应一个数据库,或者多个实例对应一个数据库。但在oracle 12c版本中,通过引入CDB和PDB的概念,一个实例可以对应多个可插拔的数据库。
可插拔数据库的应用场景如下:
- 生产环境中有多个应用均需要使用oracle数据库,它们仅使用非常少量的硬件资源,但是又不得不为他们创建多个实例;
- 一些不是特别重要的数据库,但是需要DBA花费大量的精力去维护;
- 为了更好的利用硬件资源以及减少管理开销,有必要将大量的部门级应用整合到少数几个oracle关系数据库中,以便部署和管理。
通过在一个集中化的平台部署多个数据库,同时又共享一个数据库实例,可以大大降低成本,即更少的实例损耗和更低的存储成本。
如果生产环境中只需要一个数据库,并不想使用可插拔数据库,可以在安装的过程中取消勾选“创建为容器数据库”的复选框,从而安装一个普通数据库。
2、oracle服务器
oracle服务器主要由实例和数据库文件组成,,也就是在SQL server中的一个数据库管理系统(DBMS)的概念。oracle服务器的组成如下所示:
oracle服务器除了维护实例和数据库文件外,还在用户建立与服务器的连接时启动服务器进程并分配PGA(程序全局区)。
3、oracle存储结构
oracle的存储结构分为物理结构和逻辑结构,这两种存储结构即相互独立又相互联系,如下所示:
物理结构主要描述的是oracle数据库的外部存储结构,即在操作系统中如何组织、管理数据。
逻辑结构主要描述的是oral侧数据库的内部存储结构,即从逻辑上描述在oracle数据库中怎么组织、管理数据。
1)oracle物理结构
物理结构是oracle数据库创建后使用的操作系统上的物理文件,oracle数据库的物理文件分为主要文件和其他文件,其他文件主要包含的有参数文件、归档日志文件(用来给重做日志文件做备份的)、口令文件等。而主要文件中,包含的东西就要细细说来了。
主要文件中包含的如下:
①数据文件:数据文件的扩展名通常是.dbf,是物理存储oracle数据库数据的文件。
数据文件的特点如下:
- 每个数据文件只与一个数据库相联系;
- 一个表空间(表空间类似于mysql中的“库”)可包含一个或多个数据文件;
- 一个数据文件只能属于一个表空间。
②重做日志:重做日志文件的扩展名是.log,它记录了对数据的所有更改信息,并提供了一种数据恢复机制,确保在系统崩溃或其他以外出现后重新恢复数据库。
在oracle数据库中,重做日志文件是成组使用的,每个重做日志文件组可以有一个或多个重做日志文件。在工作过程中,多个重做日志文件组之间循环使用,当一个重做日志文件组写满后,会转向下一个日志文件组。重做日志文件用于记录数据库变化,是用户的事务处理日志。
③控制文件:控制文件的扩展名是.ctl,是一个二进制文件。控制文件中存储的信息有很多,其中包括数据文件和重做日志文件的名称和位置。控制文件是数据库启动及运行所必须的文件。当oracle读写数据时,要根据控制文件的信息查找数据文件。
由于控制文件的重要性,一个数据库至少要有两份控制文件。oracle 12c默认包含两个控制文件,各个控制文件内容相同,从而可以避免因为一个控制文件的损坏和导致无法启动数据库的情况出现。
控制文件中记录了以下关键信息:
- 数据文件的位置及大小;
- 重做日志文件的位置及大小;
- 数据库名称及创建时间;
- 日志***;
2)oracle逻辑结构
数据库的逻辑结构是从逻辑的角度分析数据库的组成的。oracle数据库的逻辑结构包括表空间、段、区、块和模式等。如下所示:
1)表空间(就把它当做是一个“库”,oracle中的“表空间”就是mysql、SQL server中“库”的概念)
每个oracle数据库都是由若干个表空间构成的,用户在数据库中建立的所有内容都被存储到表空间中。一个表空间可以有多个数据文件,但一个数据文件只能属于一个表空间。与数据文件这种物理结构不同,表空间属于数据库的逻辑结构。
在每个数据库中,都有一个名为“SYSTEM”的表空间,即系统表空间,还会有SYSAUX、UNDO、USERS等表空间,这些都是在创建数据库时自动创建的。管理员可以创建自定义的表空间并分配给指定用户,也可以为表空间增加和删除数据文件。
表空间有以下三类:
- 永久性表空间,一般保存基表、视图、过程和索引等的数据。SYSTEM、SYSAUX、USERS表空间是默认安装的;
- 临时性表空间,只用于保存系统中短期活动的数据,如排序数据等。
- 撤销表空间,用来帮助回退未提交的事务数据,已提交了的数据在这里是不可恢复的。
一般不需要创建临时性表空间和撤销表空间,除非把它们转移到其他磁盘中以提高性能。
表空间的目的如下:
- 对不同用户分配不同的表空间,对不同的模式对象分配不同的表空间,方便对用户操作和对模式对象的管理;
- 可以将不同数据文件创建到不同的磁盘中,有利于管理磁盘空间、提高I/O性能、备份和恢复数据等。
一般在完成oracle系统的安装并创建oracle实例后,oracle系统自动建立SYSTEM、SYSAUX、USERS等多个表空间。
默认安装的表空间用途如下:
- SYSTEM表空间:用于存放oracle系统内部表和数据字典的数据,如表名、列名、用户名等。不建议将用户创建的表、索引等对象存放到SYSTEM表空间中;
- SYSAUX表空间:作为SYSTEM的辅助表空间,用于存放各种数据库工具(如企业管理器、StatsPack、LogMiner等)用到的数据:还用于存放各模式的对象数据,如智能代理用户DBSNMP等,这些模式在数据库安装完成后就建立了相应的对象并存放在SYSAUX表空间中。
- USERS表空间:通常作为用户使用的表空间,可以在这个表空间上创建各种对象,如表、索引等。
- TEMP表空间:oracle系统用于存放临时数据的特殊表空间。例如,当操作中需要进行排序时,oracle系统就将排序的数据临时存放在该表空间内。排序处理完成后就释放排序数据所占用的空间,因此称之为临时表空间。
除了oracle系统默认创建的表空间外,我们可根据应用系统的规模及其所要存储的对象类型创建多个表空间,以区分用户数据和系统数据。
创建表空间属于数据定义语言,语法格式如下:
CREATE TABLESPACE tablespacename
DATAFILE 'filename' [SIZE integer [K|M]]
[AUTOEXTEND [OFF|ON]];
在上面的语法中:
- tablespacename是表空间的名字;
- DATAFILE指定组成表空间的一个或多个数据文件,当有多个数据文件时使用逗号分隔;
- filename是表空间中数据文件的路径和名称;
- size指定文件的大小,可以使用“K”或“M”为单位。
- AUTOEXTEND用来启用或禁用数据文件的自动扩展,若设置AUTOEXTEND参数为ON,则空间用尽会自动扩展,当设置参数为OFF时很容易出现表空间剩余容量为0,造成数据不能存储到数据库中的情况出现。
2)段
段存在与表空间中,是一种指定类型的逻辑存储结构,段由一组区组成。按照段中所存储数据的特征,以及优化系统性能的需要,段可分为四类:数据段、索引段、回退段、临时段。例如,对于每个非聚集表有一个数据段,表的所有数据存储在该段,而对于每个索引都有一个索引段。
3)区
区是磁盘空间分配的最小单位。磁盘按区来划分,每次至少分配一个区。区由连续的数据块组成。段主要是由一个或多个区构成,当段创建后,它至少包含一个区。当段中的所有空间都完全使用时,系统将自动为该段分配一个新区。区不能夸数据文件存在,只能存在一个数据文件中。
4)数据块
数据块是数据库中最小的数据组织单位。oracle数据库中的数据存储于数据块中。数据块是oracle服务器所能读取或写入的最小存储单元。oracle服务器以数据块为单位管理数据文件的存储空间。数据块的取值范围为2~64KB,它的默认大小与oracle版本有关。
5)模式
模式是数据库对象(又叫模式对象)的集合。模式对象包括表、视图、索引、同义词、序列、过程和程序包等。每创建一个用户,oracle会自动创建一个与用户名相同的模式,因此,模式又称为用户模式。用户登录后,默认访问的是与自己的名称相同的模式中的数据库对象。
4、oracle内存结构
内存结构是oracle数据库体系中最为重要的一部分,内存也是影响数据库性能的第一要素。
oracle内存存储的主要内容如下:
- 程序代码(PL/SQL、Java);
- 已经连接的会话的相关信息,包括当前所有活动会话和非活动会话;
- 程序运行时必需的相关信息,如查询计划;
- oracle进程之间通信和共享的信息。
按照内存使用方法的不同,oracle数据库的内存又可以分为SGA(系统全局区)、PGA(程序全局区)和UGA(用户全局区)。
- SGA:所有用户都能访问的实例的共享内存区域。数据块、事务处理日志、数据字典信息等都存储在SGA中。
- PGA:一类非共享的内存,专用于特定的服务器进程,并且只能够由这个进程访问。
- UGA:为用户进程存储会话状态的内存区域。根据用户数据库是配置为专用服务器模式,还是配置为共享服务器模式,UGA可以作为SGA或者PGA的一部分,它为用户会话存储数据。
SGA中包含的东西比较多,我这里写的没有耐心了,就不写了,只要知道SGA包含什么就行,SGA包含如下:
PGA不是实例的一部分,它包含单个服务器进程或单个后台进程所需的数据和控制信息。PGA是在用户进程连接到数据库并创建一个会话时自动分配的,该区内保留了每个与Oracle数据库连接的用户进程所需的内存。在一个用户会话结束后,PGA将释放。
5、oracle进程结构
oracle中有几种不同类型的进程:用户进程、服务器进程、后台进程:
- 用户进程:在数据库用户请求连接oracle服务器时启动;
- 服务器进程:在用户建立会话并连接oracle实例时启动;
- 后台进程:在oracle实例启动时启动。
在oracle数据库中,为了使系统性能更好地协调多个用户,实例系统中使用的一些附加进程,称为后台进程。这些后台进程存在与操作系统中,在实例启动时自动启动,其中有五个进程是必须启动的,否则数据库实例无法启动成功,这五个重要且必须的后台进程为:PMON(进程监控进程)、SMON(系统监控进程)、DBWR(数据写入进程)、LGWR(日志写入进程)、CKPT(检查点进程)。
关于这五个进程所执行的具体任务,若有兴趣,可以自行百度。
二、用户管理
在创建一个新数据库时,oracle将创建一些默认数据库用户,如SYS、SYSTEM等用户。这两个用户都是oracle的管理用户。如果在安装过程中选择安装示例数据库,则会自动创建HR用户、HR用户是oracle数据库的一个示例用户,也可以根据需求导入其他示例数据库。示例数据库里面包含一些测试展示用的示例表。
关于SYS、SYSTEM和自定义用户介绍:
- SYS用户是oracle中的一个超级用户,主要用来维护系统信息和管理实例。数据库中所有数据字典和视图都存在SYS模式中。数据字典存储了用来管理数据库对象的所有信息,是oracle数据库中非常重要的系统信息。SYS用户只能以SYSOPER或SYSDBA角色登录系统。
- SYSTEM用户是oracle 中默认的数据库管理员,它拥有DBA权限,该用户模式中存储了oracle管理工具使用的内部表和视图。通常通过SYSTEM用户管理oracle数据库的用户、权限和存储等,不建议在SYSTEM模式中创建用户表。SYSTEM用户不能以SYSOPER或SYSDBA角色登录系统,只能以默认方式(数据库身份验证的方式)登录。
- 自定义用户就是自己创建的用户,由于PDB的引入,自定义用户的范围和之前的版本不同。在CDB模式下,用户分为两种,分别是公用用户和本地用户,公用用户可以在CDB和PDB中使用,而本地用户只能存在与PDB中。在CDB环境中,不允许创建本地用户。并且Oracle规定,在CDB中创建公用用户时,用户名必须以c##开头。(在CDB中创建的用户就是公用用户,在PDB中创建的用户就是本地用户)。
创建用户的语法格式如下:
CREATE USER user #user是用户名
IDENTIFIED BY password #password是用户密码,区分大小写
[DEFAULT TABLESPACE tablespace] #tablespace为用户指定默认表空间
[TEMPORARY TABLESPACE tablespace] #tablespace为用户指定临时表空间
[QUOTA {integer [K|M] | UNLIMITED}ON tablespace #设置该用户对于表空间的配额,UNLIMITED表示没有限制
[QUOTA {integer [K|M] | UNLIMITED}ON tablespace ] ...]
[PASSWORD EXPIRE ]; #设置用户密码在第一次使用时作废,需要重新设置该用户密码
三、数据库权限管理
权限是执行某种类型的SQL语句或者存取其他数据库对象的权力,在oracle中,权限分为系统权限与对象权限两类。
1、系统权限
系统权限是指在数据库中执行某种系统级别的操作,或者针对某一类的对象执行某种操作的权力。例如,在数据库中创建表空间的权力,或者在数据库中创建表的权力,都属于系统权限,一般的系统权限示例如下所示:
常用的系统权限如下:
- CREATE SESSION:连接到数据库;
- CREATE TABLE:创建表;
- CREATE VIEW:创建视图;
- CREATE SEQUENCE:创建序列。
当创建一个新用户后,首先要授予其CREATE SESSION权限,使其可以访问数据库。
2、对象权限
对象权限是指针对某个特定的模式对象执行操作的权利。只能针对模式对象来设置和管理对象权限,包括数据库中的表、视图、序列、存储过程等,如下所示:
oracle数据库用户有两种获得权限的途径:①直接向用户授权;②将权限授予角色,再将角色授予一个或多个用户,使用角色能够更加方便和高效果地对权限进行管理。所以数据库管理员通常使用角色向用户授予权限,而不是直接向用户授予权限。在oracle数据库系统中预定义了很多角色,其中最常用的主要有CONNECT角色、RESOURCE角色、DBA角色等。DBA角色具有所有的系统权限,并且可以对其他用户进行角色授权。
oracle中常用的系统预定义角色如下:
- CONNECT:拥有连接数据库的权限;
- RESOOURCE:拥有创建表、触发器、过程等权限;
- DBA:数据库管理员角色,拥有管理数据库的最高权限。一个具有DBA角色的用户可以授权任何其他用户甚至其他DBA权限,要谨慎授予该角色。
#授权及撤销授权的语法格式如下:
GRANT 权限|角色 To 用户名; #授予权限
REVOKE 权限|角色 To 用户名; #撤销权限
数据库用户安全设计原则如下:
- 数据库用户权限授权按照最小分配原则;
- 数据库用户可分为管理、应用、维护、备份四类用户;
- 不允许使用sys和system用户建立数据库应用对象;
- 禁止对普通用户授权DBA权限;
- 对查询用户只开放查询权限;
- 对新建用户初次登录数据库时强制修改密码。
一般程序开发人员只要授予CONNECT和RESOURCE两个角色即可。注意:授权这两个角色就包含了授权用户无限制使用默认表空间的权限。
四、oracle数据库操作语句示例
[aaa@qq.com ~]$ lsnrctl start #启动oracle监听进程
[aaa@qq.com ~]$ netstat -anpt | grep 1521 #确定监听进程已启动
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp6 0 0 :::1521 :::* LISTEN 3145/tnslsnr
tcp6 0 0 192.168.1.1:1521 192.168.1.1:11281 TIME_WAIT -
[aaa@qq.com ~]$ sqlplus / as sysdba #使用sys用户以sysdba身份连接到oracle数据库
SQL> startup #启动数据库
SQL> create tablespace test #创建一个表空间,注意,在末尾没有分号结尾,则表示,这行和下行是同一行
2 datafile '/u01/app/oracle/oradata/orcl/testdb.dbf' #指定数据文件位置
3 size 10M autoextend on; #初始大小为10M,并设置为自动增长
表空间已创建。
[aaa@qq.com orcl]# du -h testdb.dbf #会在上面指定的路径中,生成这个文件,文件大小为11M左右
11M testdb.dbf
#以下是更改数据文件的大小为80M。
SQL> alter database datafile
2 '/u01/app/oracle/oradata/orcl/testdb.dbf'
3 resize 80M;
数据库已更改。
[aaa@qq.com orcl]# du -sh testdb.dbf #再次查看该文件,会发现大小已经更改成功了
81M testdb.dbf
#以下是向表空间添加一个初始大小为20M的数据文件,并设置为自动增长
SQL> alter tablespace test
2 add datafile '/u01/app/oracle/oradata/orcl/testdb01.dbf'
3 size 20M autoextend on;
表空间已更改。
[aaa@qq.com orcl]# du -sh testdb01.dbf #查看进行确认
21M testdb01.dbf
#以下是删除表空间
SQL> drop tablespace test including contents; #末尾的including contents表示将表空间的本地数据文件也删除,
#也可不加including contents,那样只是在逻辑上将表空间删除了,实际文件还存在
表空间已删除。
SQL> desc dba_data_files; #查看系统中有多少个数据文件
名称 是否为空? 类型
----------------------------------------- -------- ----------------
FILE_NAME VARCHAR2(513)
FILE_ID NUMBER
TABLESPACE_NAME VARCHAR2(30)
...............#省略部分内容
SQL> select file_name from dba_data_files; #查看实体数据文件
FILE_NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/system01.dbf
/u01/app/oracle/oradata/orcl/sysaux01.dbf
/u01/app/oracle/oradata/orcl/undotbs01.dbf
/u01/app/oracle/oradata/orcl/users01.dbf
SQL> select name from v$tablespace; #查看表空间
...............#省略输出的内容
SQL> select tablespace_name,file_name from dba_data_files; #查看表空间和数据文件之间的对应关系
...............#省略输出的内容
SQL> show con_name; #查看当前所在的容器
CON_NAME
------------------------------
CDB$ROOT #在CDB中
SQL> show pdbs; #查询数据库中所有容器
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 ORCLPDB MOUNTED
SQL> alter pluggable database orclpdb open; #CDB下修改可插拔库orclpdb为打开状态
插接式数据库已变更。
SQL> alter session set container=orclpdb; #在CDB下切换会话到PDB中
会话已更改。
SQL> show con_name; #查看是否切换
CON_NAME
------------------------------
ORCLPDB #已经位于ORCLPDB中
SQL> shutdown immediate; #在PDB中关闭可插拔数据库
插接式数据库已关闭。
SQL> startup #在PDB中打开可插拔数据库
插接式数据库已打开。
SQL> alter session set container=cdb$root; #切换会话到CDB中
会话已更改。
SQL> show con_name; #再次查看当前位置
CON_NAME
------------------------------
CDB$ROOT
#以下是创建一个表空间,为了给创建用户做铺垫
SQL> create tablespace testuser
2 datafile '/u01/app/oracle/oradata/orcl/testuser01.dbf'
3 size 10M autoextend on;
表空间已创建。
#接下来是创建用户
SQL> create user c##zhangsan #用户名
2 identified by pwd123 #密码
3 default tablespace testuser #用户默认的表空间
4 temporary tablespace temp #用户默认的临时表空间
5 quota unlimited on testuser #对默认表空间使用没有限制
6 password expire; #第一次登陆需要修改密码
用户已创建。
SQL> grant connect,resource to c##zhangsan; #授予connect和RESOURCE这两个权限
授权成功。
SQL> conn c##zhangsan/pwd123 #使用c##zhangsan用户登录
ERROR: #提示密码已经失效
ORA-28001: 口令已经失效
#按照提示修改密码
更改 c##zhangsan 的口令
新口令:******
重新键入新口令:******
口令已更改
已连接。 #登录成功
SQL> show user; #查看当前用户是否为“c##zhangsan”
USER 为 "C##ZHANGSAN" # OK!
SQL> create table testtable(id int,name varchar(10)); #创建一个表
表已创建。
SQL> insert into testtable values(1,'lvjianzhao'); #向表中插入数据
已创建 1 行。
SQL> select * from testtable; #查看表中的数据
ID NAME
---------- ------------------------------
1 lvjianzhao
SQL> conn sys/Jianzhao87 as sysdba #切换至sys用户
已连接。
SQL> drop user c##zhangsan cascade; #删除c##zhangsan用户
用户已删除。
SQL> alter session set container=orclpdb; #切换至PDB
会话已更改。
SQL> show con_name; #查看,确定切换成功
CON_NAME
------------------------------
ORCLPDB
SQL> alter pluggable database orclpdb open; #将可插拔数据库orclpdb打开
插接式数据库已变更。
SQL> create user jack identified by jack; #在PDB创建的用户属于本地用户,用户名前无需加“c##”
用户已创建。
SQL> alter user jack identified by jack123; #修改用户的密码
用户已更改。
SQL> grant connect to jack; #授予connect的登录权限
授权成功。
至此,oracle的一些基础命令就了解的差不多了,在oracle 12c之前的版本中,安装完以后默认会有scott用户,该用户模式下存放了用于测试的表,而oracle 12c安装完之后,没有这个,所以我这里准备了这个测试的表,可以点击下载,主要是为了引出导入脚本文件的语法。
[aaa@qq.com ~]# ls -l /tmp/test.sql #将下载下来的脚本文件放在/tmp目录下
#(这个目录下默认oracle用户也有读取的权限,如果放置其他目录,也必须要保证oracle用户可以读取到)
-r-xr-xr-x 1 root root 7735 9月 27 19:42 /tmp/test.sql
#创建用户c##scott
SQL> create user c##scott identified by scott
2 default tablespace users
3 temporary tablespace temp
4 quota unlimited on users;
用户已创建。
SQL> grant connect,resource to c##scott; #用户授权
授权成功。
SQL> @ /tmp/test.sql #导入脚本文件
表已创建。
表已创建。
..............#省略部分内容
SQL> conn c##scott/scott #切换到用户c##scott
已连接。
SQL> show user; #查看当前的用户
USER 为 "C##SCOTT"
SQL> col tname for a10 #格式化输出,让一行中显示所有的列,调整tname列的宽度为10
SQL> select * from tab; #查询当前用户下的所有的表
TNAME TABTYPE CLUSTERID
---------- --------------------- ----------
BONUS TABLE
DEPT TABLE
EMP TABLE
SALGRADE TABLE
SQL> desc emp; #查询emp表的结构
名称 是否为空? 类型
----------------------------------------- -------- --------------------
EMPNO NOT NULL NUMBER(4)
..............#省略部分内容
SQL> col empno for 9999 #格式化输出,empno列为数字,9999代表宽度为4
SQL> select * from emp; #查询emp表内容
如果是非c##scott用户,则不能直接访问c##scott用户下的测试表,需要以“模式.表名”的格式访问。以sys用户为例,若想查看c##scott下的emp表,则应该执行如下命令:
SQL> select * from c##scott.emp;
———————— 本文至此结束,感谢阅读 ————————