Oracle无法直接禁止PL/SQL Developer登录,但可通过AFTER LOGON触发器匹配v$session.program中真实程序名(如PLSQLDEV.EXE)并结合用户名拦截,需确保权限、位数一致及PDB环境适配。

不能直接禁止 PL/SQL Developer 登录,因为 Oracle 本身不识别“PL/SQL Developer”这个客户端名;但你可以用登录触发器拦截其连接行为,前提是准确匹配 v$session.program 中的真实值。
为什么 v$session.program 是唯一可靠依据
Oracle 不区分客户端工具类型,只记录会话启动时操作系统传入的程序名。PL/SQL Developer 启动连接时,会在 v$session.program 中写入类似 plsqldev.exe、PLSQL Developer 或带路径的变体(如 C:\Program Files\PLSQL Developer\plsqldev.exe),具体取决于安装方式和版本。这和 SQL Developer 的 SQL Developer 或 oracle.sqldeveloper 是两套独立标识。
常见错误现象:直接在触发器里写 LIKE '%PLSQL%',结果把 sqlplus(含 “pl”)、plsql 命名的脚本甚至某些 JDBC 驱动也误杀了。
- 务必先查真实值:
SELECT program FROM v$session WHERE sid = SYS_CONTEXT('USERENV', 'SID');(在 PL/SQL Developer 中执行一次) - 不同版本可能返回全路径、仅文件名、或大小写混杂,建议统一转大写再匹配
- 不要依赖
MODULE或ACTION字段——PL/SQL Developer 默认不设它们
创建安全有效的登录触发器
触发器必须由 SYS 或具备 ADMINISTER DATABASE TRIGGER 权限的用户创建,且逻辑要严格限定用户名 + program 组合,避免全局影响。
- 使用
AFTER LOGON ON DATABASE,不是ON SCHEMA(后者不适用于登录控制) - 只查当前会话:
SELECT UPPER(program) INTO v_program FROM v$session WHERE sid = SYS_CONTEXT('USERENV','SID');,别查全表 - 匹配示例(假设查得 program 为
PLSQLDEV.EXE):IF v_user = 'REPORT_USER' AND v_program LIKE '%PLSQLDEV.EXE%' THEN ... - 错误号必须是
-20001到-20999区间,否则触发器编译失败(报PLS-00172) - 触发器内禁止调用任何可能引发事务或查询动态视图的函数(如
DBMS_OUTPUT.PUT_LINE或查DBA_USERS)
容易被忽略的兼容性与权限陷阱
PL/SQL Developer 的连接行为受客户端位数、OCI 库路径、NLS_LANG 设置等间接影响,但这些不影响触发器生效逻辑——只要连接成功进入数据库层,触发器就一定运行。
- 多租户(CDB/PDB)环境下,触发器必须在目标 PDB 内创建并启用,
CDB$ROOT中建的对 PDB 用户无效 - 如果用户已通过
GRANT CONNECT TO获得角色,但你又执行过REVOKE CREATE SESSION FROM,那触发器前用户根本连不上,也就不会触发——得先确保用户有基础登录权 - 图形界面工具(如 PL/SQL Developer 自带的用户管理)修改权限后,常漏点
Apply或Save,务必用 SQL 查DBA_SYS_PRIVS确认 - 触发器启用后,测试必须用目标用户账号从 PL/SQL Developer 新建连接,不能复用已有会话(会话已建立,不触发)
最麻烦的点其实是 program 值不稳定:同一台机器重装 PL/SQL Developer、换安装路径、升级版本,都可能导致 v$session.program 改变。所以触发器上线前,一定要在所有目标客户端环境上实测 program 输出,并保留一个最小化白名单机制备用。











