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

如何获取SQL Server数据库审计规范详情的精确对象信息?

获取SQL Server数据库审计规范的精确对象信息

针对你遇到的问题,核心是要根据audit_class_desc的不同类型,用对应的系统视图和函数来获取准确的对象/架构信息,以下是解决方案:

问题根源

  • OBJECT_NAME()仅返回对象的名称,不会包含所属架构,无法区分同库不同架构下的同名对象。
  • 当审计类为SCHEMA时,major_id对应的是架构的ID(对应sys.schemas.schema_id),而非对象ID,用OBJECT_NAME()会返回错误结果(比如你遇到的sysrowsets)。

完整查询脚本

SELECT
    ads.name AS audit_spec_name,
    acd.audit_action_name,
    acd.audit_class_desc,
    -- 根据审计类类型获取精确对象/架构信息
    CASE 
        WHEN acd.audit_class_desc = 'SCHEMA' THEN 
            SCHEMA_NAME(acd.major_id)
        WHEN acd.audit_class_desc IN ('OBJECT OR COLUMN', 'OBJECT') THEN 
            QUOTENAME(s.name) + '.' + QUOTENAME(o.name)
        WHEN acd.audit_class_desc = 'COLUMN' THEN 
            QUOTENAME(s.name) + '.' + QUOTENAME(o.name) + '.' + QUOTENAME(c.name)
        ELSE 
            'N/A'
    END AS full_object_identifier,
    acd.is_group,
    acd.principal_id,
    USER_NAME(acd.principal_id) AS principal_name
FROM sys.database_audit_specification_details acd
JOIN sys.database_audit_specifications ads 
    ON acd.database_specification_id = ads.database_specification_id
-- 关联对象和架构视图,处理OBJECT/COLUMN类型
LEFT JOIN sys.objects o 
    ON acd.major_id = o.object_id
LEFT JOIN sys.schemas s 
    ON o.schema_id = s.schema_id
LEFT JOIN sys.columns c 
    ON acd.major_id = c.object_id AND acd.minor_id = c.column_id
WHERE ads.database_name = 'OmegaCA_Benchmark';

关键说明

  • 针对SCHEMA类型:直接用SCHEMA_NAME(acd.major_id)获取正确的架构名称。
  • 针对OBJECT OR COLUMN/OBJECT类型:通过关联sys.objects和sys.schemas,用QUOTENAME()包裹避免特殊字符问题,拼接出[架构名].[对象名]的完整标识。
  • 针对COLUMN类型:额外关联sys.columns,拼接出[架构名].[对象名].[列名]的完整列标识。
  • 关联sys.database_audit_specifications可以获取审计规范的名称,让结果更完整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 14:37:37