You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过查询获取SQL Server/Oracle中访问表的应用列表及详情?

嘿,这个需求挺常见的!我来给你拆解下SQL Server和Oracle里怎么搞定——直接用查询语句的话,得区分实时访问和历史访问,两者的实现逻辑不太一样,咱们一个个说:

SQL Server 端的实现方式

SQL Server本身没有直接的系统表能存储“访问过某表的应用程序历史列表”,但可以通过动态管理视图(DMVs)捕获当前正在访问该表的会话,或者结合扩展事件来记录历史访问。

实时捕获当前访问指定表的应用程序

如果要找当前正在和目标表交互的应用,可以把几个DMV关联起来查询,直接拿到会话、应用名、执行的SQL:

DECLARE @TableName NVARCHAR(128) = '你的表名'; -- 替换成你要查的表名

SELECT
    s.session_id,
    s.program_name AS '应用程序名称',
    s.login_name,
    s.host_name,
    t.text AS '执行的SQL语句'
FROM
    sys.dm_exec_sessions s
JOIN
    sys.dm_exec_requests r ON s.session_id = r.session_id
CROSS APPLY
    sys.dm_exec_sql_text(r.sql_handle) t
WHERE
    t.text LIKE '%' + @TableName + '%'
ORDER BY
    s.session_id;
  • 提醒下:这个查询只能抓到当前正在运行的访问请求,之前访问过的历史记录拿不到。
  • 要是需要追踪历史访问,推荐用扩展事件(比老掉牙的SQL Server Profiler轻量太多),创建一个跟踪sql_statement_completed事件的会话,把筛选条件设为语句包含目标表名,就能自动记录所有访问过该表的应用信息。
Oracle 端的实现方式

Oracle同样没有默认存储“表访问历史应用列表”的系统表,但可以通过V$SESSION、V$SQL等视图获取实时会话,或者开启审计功能来记录历史访问。

实时捕获当前访问指定表的应用程序

查询当前正在访问目标表的活跃会话和对应应用:

DECLARE
    v_table_name VARCHAR2(128) := '你的表名'; -- 替换成目标表名,注意默认要大写(Oracle表名默认大写)
BEGIN
    FOR rec IN (
        SELECT
            s.sid,
            s.serial#,
            s.program AS '应用程序名称',
            s.username,
            s.machine,
            sql.sql_text AS '执行的SQL语句'
        FROM
            v$session s
        JOIN
            v$sql sql ON s.sql_id = sql.sql_id
        WHERE
            sql.sql_text LIKE '%' || v_table_name || '%'
            AND s.status = 'ACTIVE'
    ) LOOP
        DBMS_OUTPUT.PUT_LINE('会话ID: ' || rec.sid || ' | 应用: ' || rec.program || ' | SQL: ' || rec.sql_text);
    END LOOP;
END;
/
  • 小提示:如果你的表是用小写创建的,记得在匹配表名的时候加双引号,不然会匹配不到哦。
  • 要是需要历史访问记录,得开启Oracle审计:先执行ALTER SYSTEM SET AUDIT_TRAIL=DB,EXTENDED SCOPE=SPFILE;然后重启数据库,接着执行AUDIT SELECT, INSERT, UPDATE, DELETE ON 你的表名 BY ACCESS;,之后就能通过DBA_AUDIT_TRAIL视图查询所有访问记录了:
SELECT
    username,
    machine,
    program AS '应用程序名称',
    timestamp,
    action_name,
    sql_text
FROM
    dba_audit_trail
WHERE
    obj_name = '你的表名' -- 这里也要用大写表名
ORDER BY
    timestamp DESC;
总结一下
  • 实时访问的应用程序:两个数据库都可以通过系统视图/动态管理视图关联查询得到,但只能抓取当前正在运行的会话。
  • 历史访问记录:单纯的查询语句没法直接拿到——因为数据库默认不会持久化所有的表访问记录,得提前配置扩展事件(SQL Server)或审计(Oracle)才能实现。

内容的提问来源于stack exchange,提问作者SandeepK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:39:09