一、前言
在使用 Oracle 数据库进行日常运维时,经常需要查询数据库表、视图、会话信息以及 RMAN 备份记录。
例如:
SELECT * FROM V$SESSION;
SELECT * FROM V$DATABASE;
SELECT * FROM V$INSTANCE;
SELECT * FROM V$RMAN_BACKUP_JOB_DETAILS;
这里有两个值得掌握的知识点:
-
Oracle 为什么可以直接使用 VSESSION****查询,而不需要写** **SYS.V_SESSION**?**
-
如何在 Toad for Oracle 中实现表名、字段名、视图名及同义词的自动提示与补全?
实际上,第一个问题涉及 Oracle 的同义词(SYNONYM)机制,第二个问题涉及 Toad 的 Code Assist(代码辅助)功能。
本文将结合实际操作,介绍这两个知识点。
二、Oracle 同义词(SYNONYM)是什么?
2.1 同义词的基本概念
Oracle 同义词(SYNONYM)是一种数据库对象,用于给数据库中的表、视图、序列、存储过程、函数等对象创建别名。
简单理解:
同义词就是数据库对象的另一个名称。
例如,假设数据库中存在以下业务表:
HR.EMPLOYEES
其中:
-
HR:Schema(模式或对象所有者) -
EMPLOYEES:实际表名
正常情况下,其他用户访问这张表可能需要编写:
SELECT * FROM HR.EMPLOYEES;
如果为该表创建了同义词 EMP,则可以直接使用:
SELECT * FROM EMP;
其对应关系如下:
SQL查询
|
v
EMP
(同义词)
|
v
HR.EMPLOYEES
(实际表)
|
v
表数据
需要注意:
同义词本身不存储业务数据,不会复制原表,也不等于创建了一张新表。
2.2 为什么需要使用同义词?
Oracle 同义词的核心价值主要体现在以下四个方面。
| 核心作用 | 具体说明 |
|---|---|
| 简化 SQL | 不必反复输入完整的 Schema 和对象名称 |
| 屏蔽对象归属 | 应用 SQL 不需要直接引用实际对象所属的 Schema |
| 降低系统耦合 | 底层对象迁移后,可以通过调整同义词映射减少 SQL 修改 |
| 统一访问名称 | 为不同应用或数据库用户提供统一的对象访问名称 |
其中最重要的是:
降低应用程序与底层数据库对象之间的耦合。
例如,原业务表位于:
HR.EMPLOYEES
后来由于系统调整,业务表迁移到:
APP_OWNER.EMPLOYEES
如果应用程序一直通过同义词 EMP 访问,则在满足对象结构兼容和权限要求的情况下,可以通过调整同义词指向来减少应用 SQL 的修改。
应用程序
|
v
EMP
|
+---- 原来:HR.EMPLOYEES
|
+---- 后来:APP_OWNER.EMPLOYEES
这种设计体现了 Oracle 官方所说的:
-
Data Independence:数据独立性
-
Location Transparency:位置透明性
也就是说,应用程序可以在一定程度上不关心底层对象由谁拥有、实际位于哪里。
2.3 同义词是否具有安全性?
同义词具有一定的间接安全管理价值,但本身并不是安全控制机制。
例如:
SELECT * FROM EMP;
相比:
SELECT * FROM HR.EMPLOYEES;
第一种写法不需要在 SQL 中直接暴露实际的 Schema 名称。
但是必须明确:
同义词只是别名,不具备权限控制能力,也不能保证对象的真实名称不被查询到。
即使创建了同义词,如果当前用户没有实际对象的查询权限,仍然无法访问数据。
因此,Oracle 数据库真正的安全性仍需要依靠:
-
用户和角色管理
-
对象级权限控制
-
最小权限原则
-
视图的数据访问限制
-
数据库审计机制
同义词更多起到简化访问、统一命名和辅助管理的作用。
三、Oracle 同义词的分类
Oracle 同义词主要分为两种:
3.1 私有同义词(Private Synonym)
私有同义词属于指定用户的 Schema。
例如:
假设当前登录用户为 APP_USER,需要通过别名访问 HR.EMPLOYEES 表。
首先,由管理员根据业务需求授予查询权限:
GRANT SELECT ON HR.EMPLOYEES TO APP_USER;
然后使用 APP_USER 账号创建私有同义词:
CREATE SYNONYM EMP FOR HR.EMPLOYEES;
以后该用户即可执行:
SELECT * FROM EMP;
这里有两个前提:
-
APP_USER具有创建私有同义词的系统权限。 -
APP_USER具有访问HR.EMPLOYEES的对象权限。
以上授权和建同义词操作仅为教学示例,不应在生产环境未经审批直接执行。
3.2 公共同义词(Public Synonym)
公共同义词属于 PUBLIC,可以供数据库中的不同用户通过统一名称引用。
创建示例:
CREATE PUBLIC SYNONYM EMP
FOR HR.EMPLOYEES;
公共同义词创建后,其他用户可以通过 EMP 这个名称引用对应的对象。
但需要注意:
Public Synonym 允许用户引用统一的对象名称,不代表所有用户自动获得底层表的访问权限。
另外,Oracle 在解析未指定 Schema 的对象名称时,通常优先查找当前 Schema 的对象或私有同义词,再考虑公共同义词。因此,如果出现同名对象,需要注意名称解析顺序。
3.3 两种同义词的区别
| 对比项 | 私有同义词 | 公共同义词 |
|---|---|---|
| 所属范围 | 指定 Schema | PUBLIC |
| 创建语法 | CREATE SYNONYM | CREATE PUBLIC SYNONYM |
| 典型用途 | 应用访问其他 Schema 的对象 | 提供公共对象访问名称 |
| 是否复制数据 | 否 | 否 |
| 是否自动授权 | 否 | 否 |
生产环境建议:
对于普通应用系统,优先根据业务需要使用私有同义词,避免随意创建大量公共同义词,造成对象名称冲突和管理复杂度增加。
四、Oracle V$ 动态性能视图与同义词的关系
4.1 V$ 为什么可以直接查询?
Oracle 中常见的动态性能视图包括:
SELECT * FROM V$DATABASE;
SELECT * FROM V$INSTANCE;
SELECT * FROM V$SESSION;
这些 SQL 中的 V$DATABASE、V$INSTANCE、V$SESSION,通常都是 Oracle 创建的公共同义词。
它们分别指向 SYS Schema 下对应的 V_$ 视图。
| 公共同义词 | 实际视图 |
|---|---|
| V$DATABASE | SYS.V_$DATABASE |
| V$INSTANCE | SYS.V_$INSTANCE |
| V$SESSION | SYS.V_$SESSION |
| V$LOCK | SYS.V_$LOCK |
| V$SQL | SYS.V_$SQL |
| V$RMAN_BACKUP_JOB_DETAILS | SYS.V_$RMAN_BACKUP_JOB_DETAILS |
例如:
SELECT * FROM V$SESSION;
通过公共同义词,通常可以访问:
SELECT * FROM SYS.V_$SESSION;
两种方式最终访问同一个底层视图对象,但都需要具备相应权限。
Oracle 官方建议日常使用 V$ 名称访问动态性能视图。
4.2 V 与 V_ 的区别
可以按照下面的关系理解:
V$SESSION
|
| PUBLIC SYNONYM
v
SYS.V_$SESSION
|
| 动态性能视图
v
Oracle内部动态性能数据
-
V$SESSION:公共同义词。 -
SYS.V_$SESSION:SYS 下对应的实际动态性能视图。 -
动态性能信息:来自 Oracle 内部内存结构、固定表以及其他内部数据来源。
4.3 如何查看同义词的实际指向?
可以执行下面的 SQL:
SELECT
OWNER,
SYNONYM_NAME,
TABLE_OWNER,
TABLE_NAME
FROM DBA_SYNONYMS
WHERE OWNER = 'PUBLIC'
AND SYNONYM_NAME IN (
'V$SESSION',
'V$DATABASE',
'V$INSTANCE'
)
ORDER BY SYNONYM_NAME;
预期查询结果:
OWNER SYNONYM_NAME TABLE_OWNER TABLE_NAME
------ ------------- ------------ --------------
PUBLIC V$DATABASE SYS V_$DATABASE
PUBLIC V$INSTANCE SYS V_$INSTANCE
PUBLIC V$SESSION SYS V_$SESSION
DBA_SYNONYMS 需要相应的数据字典查询权限。
如果没有对应权限,可以尝试查询当前用户可见的 ALL_SYNONYMS。
4.4 补充:V 与 GV 有什么区别?
在 Oracle RAC 集群环境下,还经常接触 GV$ 动态性能视图。
例如:
SELECT
INST_ID,
INSTANCE_NAME,
HOST_NAME
FROM GV$INSTANCE;
区别如下:
| 视图 | 说明 |
|---|---|
| V$INSTANCE | 查询当前连接实例的信息 |
| GV$INSTANCE | 查询 RAC 中各相关实例的信息 |
GV$ 系列通常通过 INST_ID 字段区分不同的 RAC 实例。
不过,并不是所有 V$ 视图的数据都只针对本实例,部分视图提供的是数据库级共享信息,实际应根据具体视图定义判断。
五、Toad for Oracle 如何开启 SQL 智能补全?
理解同义词后,就可以进一步理解为什么在 Toad 中需要启用 Public Synonyms。
5.1 Code Assist 是什么?
Toad for Oracle 内置了 Code Assist(代码辅助)功能,也经常称为 Code Insight 或 Toad Insight。
主要用于辅助输入:
-
数据库表名
-
字段名称
-
视图名称
-
同义词名称
-
存储过程
-
函数
-
程序包
例如,在 SQL 编辑器中输入:
SELECT * FROM V$
如果配置正确,并且 Toad 能够加载相应对象,就可以显示匹配的动态性能视图同义词。
5.2 进入 Code Assist 配置页面
打开 Toad for Oracle。
依次进入:
View → Toad Options → Editor → Code Assist
不同版本的 Toad 可能存在少量界面差异,但主要配置路径基本一致。
5.3 开启 SQL 自动提示
在 Code Assist 设置界面中,重点检查以下配置:
| 配置参数 | 推荐设置 | 说明 |
|---|---|---|
| Auto invoke | 勾选 | 自动触发智能提示 |
| Popup auto invoke delay (ms) | 1500 | 自动提示延迟 1.5 秒 |
| Cache results | 勾选 | 缓存对象提示结果 |
| Sort alphabetically | 勾选 | 按名称排序 |
| Enable parameter assistance | 按需勾选 | 存储过程、函数参数提示 |
其中最重要的是:
Auto invoke:启用自动弹出提示。
Popup auto invoke delay (ms):设置提示延迟时间。
例如:
Auto invoke:√
Popup auto invoke delay (ms):1500
表示在符合自动补全触发条件的 SQL 输入场景下,停止输入约 1.5 秒,Toad 会尝试自动弹出提示列表。
该功能已经通过实际操作验证。
如果希望响应更快,也可以测试:
Popup auto invoke delay (ms):500
即将自动提示延迟调整为 0.5 秒。
5.4 设置对象类型
在 Code Assist 页面中找到:
Code Insight → Include → Object Types
重点启用以下对象类型:
| 对象类型 | 是否建议开启 |
|---|---|
| Tables | 建议 |
| Views | 建议 |
| Synonyms | 建议 |
| Public Synonyms | 重点开启 |
| Procedures | 建议 |
| Functions | 建议 |
| Packages | 建议 |
| Users | 按需开启 |
这里最重要的是:
Public Synonyms(公共同义词)。
因为前面已经介绍,Oracle 常用的 V$SESSION、V$DATABASE 等名称就是公共同义词。
如果没有启用 Public Synonyms,Toad 可能无法正确提示这些对象。
如果想让 Toad 同时提示表、视图、同义词、程序包等各种数据库对象,也可以将 Object Types 中的对象类型全部勾选。
不过,需要注意:
对象类型并不是勾选得越多越好。
当数据库中对象数量较大时,全部启用可能增加元数据查询和候选列表加载时间。
实际生产环境建议按需开启。
5.5 配置对象过滤规则
在 Code Assist 设置中,还需要检查类似:
Exclude those start...
的对象排除选项。
如果该规则设置了会匹配 V$ 等对象的前缀,则可能造成代码提示列表为空。
建议查看其具体排除内容,必要时临时取消相关排除规则进行测试。
设置完成后,点击:
Apply → OK
保存配置。
六、Toad SQL 自动补全的实际使用
6.1 自动弹出提示
在 SQL 编辑器中输入:
SELECT * FROM V$
然后停止输入约 1.5 秒。
如果已经开启 Auto invoke,Toad 会尝试根据当前对象前缀自动显示提示列表。
匹配的对象可能包括:
V$DATABASE
V$INSTANCE
V$SESSION
V$SQL
V$LOCK
V$RMAN_BACKUP_JOB_DETAILS
...
具体显示内容取决于当前用户权限、对象过滤规则及 Toad 的元数据缓存情况。
6.2 使用 Ctrl + T 手动提示
除了自动提示,还可以手动触发:
Ctrl + T
例如:
SELECT * FROM V$
将光标放在 $ 后面,按 Ctrl + T。
Toad 会尝试显示与当前输入前缀相匹配的数据库对象。
6.3 使用 Ctrl + . 补全表名
还可以尝试:
Ctrl + .
该快捷键可用于表名自动补全;如果存在多个匹配结果,可能显示候选对象列表。
6.4 自动补全普通表名
假设当前用户能够访问 HR Schema。
输入:
SELECT * FROM HR.
在 HR. 后面触发代码提示,Toad 可以尝试显示该 Schema 下当前账号可见的表、视图等对象。
如果无法提示 Schema 下的对象,可以检查 Code Assist 中的 Users 对象类型是否启用。
6.5 自动补全字段名称
例如:
SELECT *
FROM HR.EMPLOYEES E
WHERE E.
将光标放在 E. 后面触发提示。
如果数据库中存在该表,且当前账号可以访问相关元数据,Toad 可以提示表字段,例如:
EMPLOYEE_ID
FIRST_NAME
LAST_NAME
EMAIL
HIRE_DATE
这对于日常 SQL 开发和数据库运维非常实用。
七、Ctrl + T 提示列表为空的排查方法
在实际操作中,可能遇到以下问题:
输入:
SELECT * FROM V$
按 Ctrl + T 后,提示窗口已经弹出,但是没有任何对象。
可以按照以下顺序排查。
7.1 检查 Code Insight 是否开启
进入:
View
→ Toad Options
→ Editor
→ Code Assist
确认 Code Insight 相关功能已经启用。
7.2 检查 Public Synonyms
确认以下选项已经勾选:
Tables √
Views √
Synonyms √
Public Synonyms √
如果没有启用公共同义词,V$ 系列对象可能不会显示。
7.3 检查对象过滤规则
检查 Exclude those start... 等过滤选项是否排除了相关对象。
必要时临时取消排除规则,再重新测试。
7.4 区分 V 和 V_
以下两个名称不能混淆。
公共同义词:
SELECT * FROM V$SESSION;
实际动态性能视图:
SELECT * FROM SYS.V_$SESSION;
因此,如果要提示公共同义词,可以输入:
SELECT * FROM V$
如果要提示 SYS 下对应的视图,可以尝试输入:
SELECT * FROM SYS.V_$
两种输入方式对应不同的对象名称与元数据匹配范围。
7.5 查询数据库是否存在同义词
使用只读 SQL 检查:
SELECT
OWNER,
SYNONYM_NAME,
TABLE_OWNER,
TABLE_NAME
FROM ALL_SYNONYMS
WHERE OWNER = 'PUBLIC'
AND SYNONYM_NAME LIKE 'V$%'
AND ROWNUM <= 20;
如果能够查询到相关同义词,说明数据库中确实存在对应对象,接下来应重点检查 Toad 的配置、缓存及对象可见性。
7.6 刷新 Code Assist 缓存
如果配置正确但仍无法提示,可以尝试:
-
点击提示窗口的刷新按钮。
-
重新进入 Code Assist 设置页面。
-
点击 Apply 和 OK。
-
关闭并重新打开 SQL Editor。
-
必要时重新启动 Toad。
另外,如果 SQL 编辑器包含多条语句,需要检查语句之间的分号是否完整,避免影响代码提示对当前 SQL 上下文的识别。
八、生产数据库使用注意事项
在 Oracle RAC、DG、ADG 等生产环境中,开启 Toad 的 Code Assist 功能通常不会修改数据库对象或数据库参数。
其主要工作方式是读取数据库对象的相关元数据,再向用户显示候选名称。
但仍需注意以下事项:
-
智能补全会产生额外的元数据查询。
-
数据库对象数量较多时,提示可能变慢。
-
不建议无实际需要就启用全部对象类型。
-
可以开启缓存功能,减少重复加载。
-
应使用具有适当权限的日常运维账号,避免为了补全功能而盲目提高数据库权限。
需要特别区分:
SQL 智能补全是客户端辅助功能,实际执行 SQL 时仍然需要根据语句内容评估生产环境风险。
九、总结
本文主要介绍了两个相互关联的 Oracle 数据库知识点。
1. Oracle 同义词
Oracle 同义词(SYNONYM)用于为数据库对象创建别名。
其核心作用为:
-
简化 SQL 编写
-
屏蔽对象所属 Schema
-
降低应用与底层对象的耦合
-
统一数据库对象访问名称
其中,V$SESSION、V$DATABASE 等就是 Oracle 公共同义词的典型应用。
需要特别注意:同义词不是权限控制机制,也不会自动赋予数据库对象访问权限。
2. Toad SQL 智能补全
Toad for Oracle 可以通过 Code Assist 功能实现表名、字段名、视图名以及同义词的自动补全。
核心设置路径:
View
└── Toad Options
└── Editor
└── Code Assist
├── Auto invoke:√
├── Cache results:√
├── Popup auto invoke delay:1500
└── Object Types
├── Tables:√
├── Views:√
├── Synonyms:√
├── Public Synonyms:√
├── Procedures:√
├── Functions:√
└── Packages:√
常用快捷键:
| 操作 | 快捷键 |
|---|---|
| 手动打开 Code Insight 提示列表 | Ctrl + T |
| 表名自动补全 | Ctrl + . |
| 自动弹出提示 | 开启 Auto invoke |
最终建议:
日常 Oracle 数据库运维中,建议开启 Toad 的自动提示功能,并根据实际需求配置对象类型。理解同义词的原理后,就能更清楚地掌握 V$ 动态性能视图的访问方式,也能更高效地使用 Toad 编写和排查 SQL。
十、参考资料
-
Oracle Database 19c --- CREATE SYNONYM
-
Oracle Database 19c --- Data Dictionary and Dynamic Performance Views
-
Quest --- What are the keyboard shortcut for Code Assist/Toad Insight?
-
Quest --- Public Synonyms 与 Toad Insight 配置
-
Quest --- Toad Insight 提示列表无法显示的排查方法