好的,我们来对 Oracle 19C 数据库中的 V$PWFILE_USERS 动态性能视图进行一次全面、深入的详解。
1. 作用与概述
V$PWFILE_USERS 视图的主要作用是列出当前被授予了 SYSDBA、SYSOPER、SYSASM、SYSBACKUP、SYSDG、SYSKM 等特殊管理权限的用户。这些权限允许用户执行超越其自身 schema 范围的、影响数据库实例本身的高级操作(如启动/关闭数据库、创建数据库、执行备份恢复等)。
关键点:
- 它只显示来自密码文件(Password File)的授权信息。
- 它不显示通过操作系统认证(如
OSDBA,OSOPER组)或集中式用户管理(如 Oracle Internet Directory)获得这些权限的用户。 - 这个视图对于监控和管理拥有最高数据库权限的用户至关重要,是数据库安全审计的关键部分。
2. 使用场景
- 安全审计与合规性检查:定期查询该视图,以确认哪些用户拥有超级权限,确保权限分配符合公司安全策略。
- 故障排除与连接问题:当用户尝试以
SYSDBA身份连接失败时,可以检查此视图确认其权限是否已正确授予。 - 权限管理:在授予或撤销
SYSDBA等权限后,立即查询此视图以验证操作是否成功。 - 环境确认:在陌生的数据库环境中,快速了解拥有特权的用户列表。
3. 字段含义详解
以下是 V$PWFILE_USERS 视图包含的字段及其详细含义。请注意,不同版本的 Oracle 可能字段略有不同,但核心字段一致。
| 字段名 | 数据类型 | 可选值(样例) | 含义详解 |
|---|---|---|---|
| USERNAME | VARCHAR2(30) | SYS, SYSTEM, DBA_USER | 被授予了管理权限的 Oracle 用户名。 |
| SYSDBA | VARCHAR2(5) | TRUE, FALSE | 指示用户是否拥有 SYSDBA 权限。这是最高权限,允许用户执行任何数据库操作,包括启动和关闭数据库。 |
| SYSOPER | VARCHAR2(5) | TRUE, FALSE | 指示用户是否拥有 SYSOPER 权限。此权限允许用户执行基本操作任务(如启动/关闭、备份、归档),但不能查看或修改用户数据。 |
| SYSASM | VARCHAR2(5) | TRUE, FALSE | 仅适用于 Oracle Automatic Storage Management (ASM)。指示用户是否拥有管理 ASM 实例的权限。在数据库实例上查询此视图,此列对所有用户通常都为 FALSE。 |
| SYSBACKUP | VARCHAR2(5) | TRUE, FALSE | 指示用户是否拥有 SYSBACKUP 权限。此权限专门用于使用 RMAN 执行备份和恢复操作,比 SYSDBA 权限范围更小,更安全。 |
| SYSDG | VARCHAR2(5) | TRUE, FALSE | 指示用户是否拥有 SYSDG 权限。此权限专门用于管理 Oracle Data Guard 配置。 |
| SYSKM | VARCHAR2(5) | TRUE, FALSE | 指示用户是否拥有 SYSKM 权限。此权限专门用于管理透明数据加密(TDE)的密钥库(Keystore)。 |
| CON_ID | NUMBER | 0, 3, … | 容器 ID。在多租户环境中,标识该行数据属于哪个容器。0 表示该行适用于整个 CDB(所有 PDB)。对于非 CDB,此值为 0。 |
4. 相关视图与基表
-
相关视图:
V$PWFILE_INFO:显示关于密码文件本身的信息,例如它所在的路径、是否启用了“忽略大小写”功能等。这是另一个非常重要的相关视图。DBA_USERS:显示数据库中的所有用户。你可以通过连接DBA_USERS.USERNAME和V$PWFILE_USERS.USERNAME来获取更完整的用户信息(如账户状态、创建时间等)。
-
基表:
V$PWFILE_USERS是一个动态性能视图,它没有直接对应的“基表”。- 它的数据直接来源于内存中的数据库实例状态信息。更准确地说,当实例启动时,它会读取密码文件(
orapw<ORACLE_SID>)并将其内容加载到内存中。V$PWFILE_USERS视图正是反映了这份在内存中缓存的权限信息。 - 密码文件本身可以看作是这个视图的“底层数据源”,但它是一个二进制文件,无法直接查询。
5. 底层详细原理
-
密码文件(Password File):
- 这是一个存储在数据库服务器操作系统上的特殊二进制文件,通常名为
orapw<ORACLE_SID>(如orapwORCL)。 - 它由
orapwd实用程序创建(例如:orapwd file=orapwORCL password=my_password entries=10)。entries参数限制了可以在此文件中存储的特权用户数量。 - 它的主要作用是在数据库实例未启动或处于非加载状态时,对试图以
SYSDBA等权限连接的用户进行身份验证。因为此时数据字典还不可用,无法通过数据字典来验证权限。
- 这是一个存储在数据库服务器操作系统上的特殊二进制文件,通常名为
-
身份验证流程:
- 当用户尝试
CONNECT / AS SYSDBA(操作系统认证)时,Oracle 会检查该用户是否属于操作系统的特定特权组(如 Windows 上的ORA_DBA,Unix/Linux 上的dba组)。如果属于,则授权连接。此方式不会在V$PWFILE_USERS中体现。 - 当用户尝试
CONNECT username/password AS SYSDBA(密码文件认证)时:
a. 实例检查提供的用户名和密码。
b. 实例首先会查看内存中缓存的密码文件信息(即V$PWFILE_USERS的内容)。
c. 如果在内存信息中找到了该用户并且密码哈希值匹配,且具有请求的权限,则授权连接。
d. 如果实例刚刚启动,缓存信息尚未建立,则会直接去读取磁盘上的密码文件进行验证,验证成功后会将信息加载到内存中。
- 当用户尝试
-
视图数据来源:
V$PWFILE_USERS的内容就是从步骤 2 中提到的内存中的缓存信息直接映射而来的。这就是为什么当你使用GRANT SYSDBA TO scott;授予权限后,无需提交(COMMIT)或等待,立即查询V$PWFILE_USERS就能看到变化的原因。授权操作直接更新了内存中的结构和磁盘上的密码文件。
-
与数据字典视图的区别:
- 特权权限(如
SYSDBA)不是普通的数据库权限(如CREATE TABLE)。它们不会被记录在SYSTEM表空间的数据字典表(如SYS.SYSAUTH$)中。 - 因此,你无法通过查询
DBA_SYS_PRIVS等数据字典视图来获取这些信息,必须使用V$PWFILE_USERS。
- 特权权限(如
6. 相关知识点介绍
-
两种超级用户认证方式:
- 密码文件认证:需要提供用户名和密码。信息存储在密码文件中,并体现在
V$PWFILE_USERS里。 - 操作系统认证:将操作系统用户加入特定的 OSDBA/OSOPER 组(如
dba),连接时使用CONNECT / AS SYSDBA。这种方式不会在V$PWFILE_USERS中显示。Oracle 优先使用操作系统认证。
- 密码文件认证:需要提供用户名和密码。信息存储在密码文件中,并体现在
-
REMOTE_LOGIN_PASSWORDFILE 参数:
- 这个初始化参数决定了密码文件的使用方式。
NONE:禁用密码文件认证,只允许操作系统认证。EXCLUSIVE:(默认值)密码文件只能被一个数据库使用,并且可以包含除SYS以外的用户。SHARED:多个数据库共享一个密码文件,但此文件中只能识别SYS用户。- 要使用
V$PWFILE_USERS并管理多个特权用户,此参数必须设置为EXCLUSIVE。
-
密码文件的管理:
- 添加用户:
GRANT SYSDBA TO username; - 移除用户:
REVOKE SYSDBA FROM username; - 修改密码:
ALTER USER username IDENTIFIED BY new_password;(注意:以SYSDBA连接后,可以为任何用户修改密码,包括自身)。 - 如果
entries参数设定的数量不足,需要使用orapwd命令重建一个更大的密码文件。
- 添加用户:
7. 常用查询 SQL
-
查询所有拥有特权权限的用户:
SELECT * FROM V$PWFILE_USERS ORDER BY USERNAME; -
查询拥有 SYSDBA 权限的用户:
SELECT USERNAME FROM V$PWFILE_USERS WHERE SYSDBA = 'TRUE'; -
查询拥有 SYSBACKUP 或 SYSDG 权限的用户(用于审计):
SELECT USERNAME, SYSBACKUP, SYSDG FROM V$PWFILE_USERS WHERE SYSBACKUP = 'TRUE' OR SYSDG = 'TRUE'; -
联合 DBA_USERS 视图,查看特权用户的账户状态(非常实用):
SELECT p.USERNAME, p.SYSDBA, p.SYSOPER, p.SYSBACKUP, d.ACCOUNT_STATUS FROM V$PWFILE_USERS p JOIN DBA_USERS d ON p.USERNAME = d.USERNAME ORDER BY p.USERNAME;这可以帮你发现那些拥有特权但账户已被锁定的安全风险。
-
查看密码文件本身的信息:
SELECT * FROM V$PWFILE_INFO;这会返回文件路径、大小、是否忽略大小写等信息。
希望这份详尽的解释能帮助您完全理解 V$PWFILE_USERS 视图。
欢迎关注我的公众号《IT小Chen》

2964

被折叠的 条评论
为什么被折叠?



