讲师中心 微信公众号

工具推荐

视频效率加速
Seko
Seko

AI短剧一键生成成片

Laper
Laper

剧本策划到成片协作

AniShort
AniShort

AI短剧协同制作平台

剧云
剧云

中文短剧剧本制作平台

怎样在Oracle 19c中创建只允许通过特定服务名连接的用户?

梦明吖_3948

梦明吖_3948

发布时间:2026-11-13 07:35:21

|

951人浏览过

|

来源于php中文网

原创

必须用登录触发器或细粒度访问控制(FGAC)限制服务名,因CREATE USER不支持绑定服务名;用户无SERVICE_NAME属性,服务名由客户端传递且对用户透明,需在会话级通过AFTER LOGON触发器校验SYS_CONTEXT('USERENV', 'SERVICE_NAME')或用DBMS_RLS动态过滤。

怎样在oracle 19c中创建只允许通过特定服务名连接的用户?

不能靠用户属性限制服务名,必须用细粒度访问控制(FGAC)或登录触发器实现。 Oracle 的 CREATE USER 语句本身不支持绑定服务名,所谓“只允许通过特定服务名连接”是会话级策略,需在连接建立后、用户认证完成前干预。

为什么直接指定服务名行不通

Oracle 用户没有 SERVICE_NAME 属性字段,DBA_USERS 或 USER$ 视图里也查不到服务名关联项。服务名是客户端连接描述符里的逻辑标识,由监听器解析后传给实例,对用户对象完全透明。试图用 ALTER USER ... IDENTIFIED EXTERNALLY 或角色限制都无效——只要密码正确、网络可达,任何服务名都能连上该用户。

用登录触发器拦截非授权服务名

这是最常用且可控的方式,在 AFTER LOGON ON DATABASE 触发器中检查 SYS_CONTEXT('USERENV', 'SERVICE_NAME'),不匹配则抛异常中断会话。

QuantOracle
QuantOracle

63个确定性量化金融计算器 + 10个通过MCP的复合工作流。期权定价、Greeks、奇异衍生品、风险指标、投资组合优化……

下载
  • 必须用 DEFINER'S RIGHT 创建,且触发器拥有者需有 SELECT_CATALOG_ROLE 或直接 SELECT 权限访问 V$SESSION
  • 触发器内避免调用可能失败的函数(如自定义 PL/SQL),否则会导致所有用户无法登录
  • 测试时务必先用 SYSTEM 或其他高权限账号验证,防止把自己锁死
  • 示例代码:
CREATE OR REPLACE TRIGGER chk_service_name_trg
AFTER LOGON ON DATABASE
DECLARE
  v_service VARCHAR2(128);
BEGIN
  v_service := SYS_CONTEXT('USERENV', 'SERVICE_NAME');
  IF v_service NOT IN ('ERP_PROD', 'ERP_REPORT') THEN
    RAISE_APPLICATION_ERROR(-20001, 'Access denied: service name "' || v_service || '" not allowed');
  END IF;
END;

用细粒度访问控制(FGAC)做更灵活的会话过滤

如果需要按服务名 + IP段 + 时间段组合控制,或者想把规则外置到表里便于运维,就该用 DBMS_RLS 添加动态策略。注意这不是传统意义上的“连接限制”,而是在首次查询时拦截,适合已有应用无法改连接串的场景。

  • 策略函数返回的谓词必须是字符串,例如 '1=0' 可立即拒绝所有查询
  • 策略需绑定到 DUAL 或一个空表(如 HR.LOGIN_CHECK),否则应用首次执行 SELECT 1 FROM DUAL 就会触发拦截
  • 策略类型设为 SHARED_STATIC 可减少解析开销,但规则变更需手动刷新策略
  • 容易漏掉的点:PL/SQL 包初始化块、DBMS_SCHEDULER 作业、UTL_HTTP 外部调用等隐式会话可能绕过该策略

监听器端配合(仅限硬隔离场景)

若目标是彻底阻止非授权服务名抵达数据库进程,可在 listener.ora 中为不同服务名配置独立 SID_LIST,并用 GLOBAL_DBNAME 和 ORACLE_HOME 绑定特定数据库实例;再配合 sqlnet.ora 的 SQLNET.INVITED_NODES 或防火墙规则,从网络层过滤。但这属于基础设施级控制,和用户权限模型无关,且维护成本高。

真正难的是触发器里那个 SYS_CONTEXT('USERENV', 'SERVICE_NAME') 的值——它依赖客户端实际使用的 TNS 别名或 JDBC URL 中的 service_name 参数,不是数据库自己生成的。很多应用用 tnsnames.ora 配了别名却没填 SERVICE_NAME,结果取出来是空字符串或默认值,这种细节不验一遍,策略就形同虚设。

热门AI工具

更多
讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
oracle清空表数据
oracle清空表数据

当表中的数据不需要时,则应该删除该数据并释放所占用的空间。本专题为大家提供oracle清空表数据的相关文章,帮助大家解决该问题。

1141

2023.08.16

Oracle中declare的使用
Oracle中declare的使用

Oracle DECLARE语句是PL/SQL编程语言中用于声明变量、常量、游标或异常的关键字。它的主要作用是在程序中定义这些对象,以便在后续的代码中使用。DECLARE语句的语法简单明了,可以根据需要声明多个对象。通过使用这些声明的对象,可以进行各种操作,如计算、查询数据库、处理异常等 。

3433

2023.09.15

oracle怎么分页
oracle怎么分页

实现分页的步骤:1、使用ROWNUM进行分页查询;2、在执行查询之前进行设置分页参数;3、使用"COUNT(*)"函数来获取总行数,并使用"CEIL"函数来向上取整计算总页数;4、在外部查询中使用"WHERE"子句来筛选出特定的行号范围,以实现分页查询。想了解更多oracle怎么分页的文章,可以来阅读本专题先的文章。

3430

2023.09.18

Oracle查看表操作历史记录
Oracle查看表操作历史记录

查看操作历史记录的方法:1、使用Oracle内置的审计功能,可以记录数据库中发生的各种操作,包括登录、DDL语句、DML语句等;2、使用Oracle日志文件,其中包含了数据库中发生的各种操作,可以通过查看日志文件来获取操作历史记录;3、使用Oracle的Flashback功能,可以查看数据库在某个时间点的操作历史记录;4、使用第三方工具等。本专题还提供其他查看表操作的文章,大家可以免费阅读。

1969

2023.09.19

Oracle中RAC的用法
Oracle中RAC的用法

Oracle中RAC的用法:1、通过在多个服务器上运行数据库实例来提供高可用性;2、允许在需要时增加或减少节点数量;3、通过将工作负载分布到多个节点上来实现负载均衡;4、使用共享存储来实现多个节点之间的数据共享;5、允许多个节点同时处理数据库请求,从而实现并行处理;6、提供了透明故障切换功能;7、使用了一些技术来确保数据的一致性;8、提供了管理工具来简化RAC环境的管理和维护。本专题还提供RAC相关的其他文章,大家可以免费阅读。

2553

2023.09.19

oracle imp
oracle imp

imp是Oracle数据库中的一个命令行工具,用于将导出的数据和对象从一个数据库实例导入到另一个数据库实例。imp命令的一般语法为“imp username/password@connect_string file=file_name [options]”。

3589

2023.09.19

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4949

2023.11.02

oracle通配符有哪些
oracle通配符有哪些

oracle通配符有“%”、“_”、“[]”和“[^]"。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

257

2023.11.08

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

0

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn