如何识别使用sys/system连接的数据库程序、模块及存储过程?
识别Oracle中以SYSTEM/SYS身份运行的程序、模块及数据库对象
以下是几种实用方法,帮你定位所有依赖SYSTEM/SYS账号的程序、存储过程、包及相关模块:
搜索PL/SQL对象中的硬编码连接信息
很多存储过程、包、触发器等对象里会硬写SYSTEM/SYS的连接串,直接查询数据字典找出这类对象:SELECT owner, name, type, line, text FROM dba_source WHERE UPPER(text) LIKE '%SYS/%' OR UPPER(text) LIKE '%SYSTEM/%' OR UPPER(text) LIKE '%AS SYSDBA%';注意:结果可能包含注释里的匹配内容,需要人工核对过滤误报。
查看审计记录定位历史执行对象
如果数据库开启了审计功能,可以通过审计日志查看SYSTEM/SYS账号执行过的对象操作:SELECT username, owner, obj_name, obj_type, action_name, timestamp FROM dba_audit_trail WHERE username IN ('SYS', 'SYSTEM') AND action_name IN ('EXECUTE', 'CREATE', 'ALTER', 'DELETE', 'INSERT', 'UPDATE');这个查询能帮你找到历史上SYSTEM/SYS执行过的各类数据库对象,对应到实际运行的程序或模块。
实时捕捉活跃的SYSTEM/SYS会话
查看当前正在用SYSTEM/SYS连接的会话,以及正在执行的SQL,直接定位运行中的程序:SELECT s.sid, s.serial#, s.username, s.program, s.machine, s.osuser, q.sql_text FROM v$session s LEFT JOIN v$sql q ON s.sql_id = q.sql_id WHERE s.username IN ('SYS', 'SYSTEM') AND s.status = 'ACTIVE';结果里的
program字段会显示发起连接的程序名称,machine字段显示运行程序的服务器。排查定时任务中的SYSTEM/SYS执行作业
检查DBMS_SCHEDULER和DBMS_JOB中的定时任务,很多后台任务会用SYSTEM/SYS账号运行:
针对DBMS_SCHEDULER:SELECT owner, job_name, job_type, program_name, enabled, last_start_date FROM dba_scheduler_jobs WHERE owner IN ('SYS', 'SYSTEM') OR (job_action LIKE '%SYS%' OR job_action LIKE '%SYSTEM%');针对旧版DBMS_JOB:
SELECT job, log_user, priv_user, schema_user, what FROM dba_jobs WHERE log_user IN ('SYS', 'SYSTEM') OR priv_user IN ('SYS', 'SYSTEM') OR schema_user IN ('SYS', 'SYSTEM');检查外部程序配置文件
除了数据库内部对象,还要排查应用服务器、ETL工具、脚本文件(Shell/Bat等)中的配置,搜索包含sys/、system/、as sysdba的配置项,这些地方往往是硬编码连接串的重灾区。
内容的提问来源于stack exchange,提问作者pavankumar
相关产品推荐
相关产品推荐

