我遇到一个问题,存储过程间歇性地导致数据库触发器触发。触发器用于CREATE_FUNCTION, CREATE_PROCEDURE, CREATE_TABLE, CREATE_VIEW, CREATE_TRIGGER
但过程本身不做任何这些事情。这是一个简单的编写过程,它采用 XML 参数并将值插入一组表中。不寻常的一件事(对我们来说)是它正在使用WITH XMLNAMESPACES
,但它成为问题似乎很奇怪。
免责声明:我正在处理这个问题,立即删除。我不得不相信最初的开发人员,他们不会也试图在数据库之上的代码中创建一个对象(他们说是这种情况)。我还在检查现在写入的所有表,以确保它们没有奇怪的触发器试图做他们不应该做的事情。到目前为止,我无法在测试环境中复制这种效果,即使是在模拟具有最低访问权限的用户时也是如此。这是在 SQL Server 2014 服务器上。
这个问题暴露出来是因为数据库触发器的目的是只让“构建”登录在数据库上创建对象。
因此,为了缩小我的问题范围,是否有可能WITH XMLNAMESPACES
成为这里的问题?
更新:作为后续行动,我能够获得必要的信息。看起来错误是因为调用代码在调用有问题的存储过程之后还调用了:
exec sp_describe_first_result_set N' EXEC usp_Problem_procedure @P1 ',N'@P1 xml'
看起来这是真正导致错误的原因。看起来触发器最终并不是唯一的问题。即使修复或禁用触发器也会导致后来的错误:
Msg 11528, Level 16, State 1, Procedure sp_describe_first_result_set, Line 1
The metadata could not be determined because statement 'REVERT
--Check if SSB is enabled in this database' in procedure 'sp_send_dbmail' does not support metadata discovery.
显然,其中一个嵌套过程有可能使用 sp_send_dbmail(我们不鼓励这样做,首先,因为它不止一次破坏了 Exchange 服务器)。
就是这样了。一旦我向开发人员展示了正在发生的事情,他们就会意识到他们只需要稍微不同地调用一个方法,就可以避免这个问题。
对于标题中的问题:我要说不。其他事情正在发生,迫使 DDL 触发器触发。
您应该(至少暂时)更改 DDL 触发器以将
EVENTDATA()
输出存储到表中,以便您可以检查应用程序在调用此存储过程时还发送了什么。必须发送额外的 DDL,例如ALTER
orDROP
/CREATE
,因为根据定义,DDL 触发器不能简单地通过执行本身不发出 DDL 命令的存储过程来触发。您可能还想设置一个服务器端跟踪,过滤到此应用程序,以便您可以看到除了调用存储过程之外它还可能向服务器发送什么,因为它有可能正在做某事他们不知道。信任但要验证。