为什么权限错误会导致 XACT_ABORT 设置为 OFF 且 ANSI_WARNINGS 设置为 ON 的事务失败?

Joe*_*ish 6 sql-server error-handling

考虑以下用户无权执行的 T-SQL SP_TRACE_GENERATEEVENT

SET XACT_ABORT OFF;

SET ANSI_WARNINGS ON;

BEGIN TRANSACTION;

BEGIN TRY
    EXEC SP_TRACE_GENERATEEVENT;
END TRY
BEGIN CATCH
END CATCH;

COMMIT TRANSACTION;
Run Code Online (Sandbox Code Playgroud)

我不希望根据以下文档SET XACT_ABORT收到错误:

当 ANSI_WARNINGS=OFF 时,权限违规会导致事务中止。

但是,我收到以下错误,如 dbfiddle 中所示

消息 3930 级别 16 状态 1 第 11 行 当前事务无法提交,并且无法支持写入日志文件的操作。回滚事务。

消息 3998 级别 16 状态 1 第 1 行 在批处理结束时检测到不可提交的事务。事务被回滚。

除了调用 SP_TRACE_GENERATEEVENT 之外,其他类型的安全问题也可能会发生此问题。例如,我在尝试查询用户无法连接到该数据库的表时看到过它。我没有完整的错误案例列表。

为什么权限错误会导致XACT_ABORTset toOFFANSI_WARNINGSset to 的事务失败ON

Zik*_*ato 3

SP_TRACE_GENERATEEVENT 是扩展存储过程

\n
SELECT so.name, so.type_desc\nFROM sys.system_objects AS so\nWHERE so.name = N\'SP_TRACE_GENERATEEVENT\'\n
Run Code Online (Sandbox Code Playgroud)\n

SSMS 中查询结果的屏幕截图显示 SP_TRACE_GENERATEEVENT 是扩展存储过程

\n

它们以不同的方式工作文档,它们以不同的方式工作

\n
\n

扩展存储过程的工作过程是:

\n

当客户端执行扩展存储过程时,请求将以表格数据流(TDS) 或简单对象访问协议(SOAP) 格式从客户端应用程序传输到 Microsoft SQL Server。

\n

SQL Server 搜索与扩展存储过程关联的 DLL,并加载该 DLL(如果尚未加载)。

\n

SQL Server 调用请求的扩展存储过程(以 DLL 内的函数的形式实现)。

\n

扩展存储过程通过扩展存储过程 API 将结果集和返回参数\n返回到服务器。

\n
\n

这是Erland Sommarskog 的一篇文章一篇有关扩展存储过程中的错误处理的文章

\n
\n

SQL Server 仍然附带相当多的扩展存储过程,\n其中一些已记录在案,而其他\n仅适用于 SQL Server 附带的工具。关于错误处理,所有的赌注都落在这些人身上。没有一致的行为,并且大约\每个 XP 都有自己的特点。这是一个简短的说明\xc3\xa9。

\n

最流行的XP当然是xp_cmdshell。如果运行操作系统命令时\n发生错误,这不会在\nT\xe2\x80\x91SQL 中引发错误,但您可以检查 xp_cmdshell 的返回代码或将\n输出捕获到单列表中:插入-执行。

\n
\n

以及这个相关的问题: SQL Server catch error fromextentstored procedure

\n