在SQL Server审计中,什么是帧嵌套级别?

Abo*_*oat 3 sql-server audit

在 SQL Server 中,当函数sys.fn_get_audit_file()从审计文件返回信息时,它包含列additional_information。根据该专栏的文档,它包含 XML 格式的“一级 TSQL 堆栈”。

例子:

SELECT * FROM sys.fn_get_audit_file('\\myAuditPath\myAuditFile.sqlaudit', DEFAULT, DEFAULT)
Run Code Online (Sandbox Code Playgroud)

返回 extra_information 值,如下所示:

<tsql_stack><frame nest_level = '1' database_name = 'myDBa' schema_name = 'mySchema' object_name = 'thisObject'/></tsql_stack>
<tsql_stack><frame nest_level = '1' database_name = 'myDBa' schema_name = 'mySchema' object_name = 'someObject'/></tsql_stack>
<tsql_stack><frame nest_level = '3' database_name = 'myDBb' schema_name = 'mySchema' object_name = 'thatObject'/></tsql_stack>
Run Code Online (Sandbox Code Playgroud)

我的问题:框架的nest_level是什么?

文档只说“Frame Nest_level 表示框架的当前嵌套级别”。

该帧 Nest_level 包含值 1,2,3,4,...

它似乎不是返回的nest_level sys.dm_exec_requests。(该视图的nest_level包括值-1和0,这似乎与上面的框架nest_level无关。)

而且好像和窗口函数没有关系。(搜索“frame”一词暂时引导我走上这条路。)即使在没有窗口函数的审计行上也可以看到上面的nest_level。

您能否向我指出有关该框架 Nest_level 的任何信息,或有关 TSQL 堆栈的信息?

通过搜索“tsql_stack”(肯定带有下划线),我发现了一些关于 TSQL 堆栈的结果。但仍在寻找有关详细信息(nest_level如果有人可以提供帮助)。再次感谢。

Cha*_*ace 5

嵌套级别确实是调用堆栈的级别。换句话说,它代表了有多少条EXEC语句被嵌套了。“框架”意味着对过程的单次调用(从技术上讲,它也包括其参数)。这些帧一起构成了调用堆栈,并在对过程的调用结束时按 LIFO 顺序展开。

这与显示的值相同sys.dm_exec_requests。只是0如果没有程序正在运行,即您正在执行临时批处理,您就可以得到。我不确定-1代表什么,但它似乎只出现在系统请求中。

展示这一点的一个有趣的方法是使用显示当前嵌套级别的递归过程。

CREATE PROC p
  @maxnest int
AS

SELECT CONCAT('Before ', @maxnest) callNumber, nest_level
FROM sys.dm_exec_requests
WHERE session_id = @@SPID;

IF @maxnest > 0
BEGIN
    DECLARE @nextnest int = @maxnest - 1;
    EXEC dbo.p @nextnest;
END;

SELECT CONCAT('After ', @maxnest) callNumber, nest_level
FROM sys.dm_exec_requests
WHERE session_id = @@SPID;
Run Code Online (Sandbox Code Playgroud)

其作用是显示当前级别,然后递减参数直到0并递归自身。它将调用自己的值的次数@maxnest

不在过程中执行裸查询让我们0

SELECT nest_level
FROM sys.dm_exec_requests
WHERE session_id = @@SPID;
Run Code Online (Sandbox Code Playgroud)

但是以 的值进行递归2可以得到:

索书号 嵌套级别
之前 2 1
之前 1 2
0之前 3
0之后 3
1后 2
2后 1

数据库<>小提琴