如何获取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
相关产品推荐
相关产品推荐

