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)
当 ANSI_WARNINGS=OFF 时,权限违规会导致事务中止。
但是,我收到以下错误,如 dbfiddle 中所示:
消息 3930 级别 16 状态 1 第 11 行 当前事务无法提交,并且无法支持写入日志文件的操作。回滚事务。
消息 3998 级别 16 状态 1 第 1 行 在批处理结束时检测到不可提交的事务。事务被回滚。
除了调用 SP_TRACE_GENERATEEVENT 之外,其他类型的安全问题也可能会发生此问题。例如,我在尝试查询用户无法连接到该数据库的表时看到过它。我没有完整的错误案例列表。
为什么权限错误会导致XACT_ABORT
set toOFF
和ANSI_WARNINGS
set to 的事务失败ON
?
SP_TRACE_GENERATEEVENT 是扩展存储过程
\nSELECT 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\n它们以不同的方式工作文档,它们以不同的方式工作
\n\n\n扩展存储过程的工作过程是:
\n当客户端执行扩展存储过程时,请求将以表格数据流(TDS) 或简单对象访问协议(SOAP) 格式从客户端应用程序传输到 Microsoft SQL Server。
\nSQL Server 搜索与扩展存储过程关联的 DLL,并加载该 DLL(如果尚未加载)。
\nSQL Server 调用请求的扩展存储过程(以 DLL 内的函数的形式实现)。
\n扩展存储过程通过扩展存储过程 API 将结果集和返回参数\n返回到服务器。
\n
这是Erland Sommarskog 的一篇文章一篇有关扩展存储过程中的错误处理的文章
\n\n\nSQL Server 仍然附带相当多的扩展存储过程,\n其中一些已记录在案,而其他\n仅适用于 SQL Server 附带的工具。关于错误处理,所有的赌注都落在这些人身上。没有一致的行为,并且大约\每个 XP 都有自己的特点。这是一个简短的说明\xc3\xa9。
\n最流行的XP当然是xp_cmdshell。如果运行操作系统命令时\n发生错误,这不会在\nT\xe2\x80\x91SQL 中引发错误,但您可以检查 xp_cmdshell 的返回代码或将\n输出捕获到单列表中:插入-执行。
\n
以及这个相关的问题: SQL Server catch error fromextentstored procedure
\n