我遇到了一个问题,在这种情况下,一个存储过程会导致数据库触发器触发。触发器是针对CREATE_FUNCTION, CREATE_PROCEDURE, CREATE_TABLE, CREATE_VIEW, CREATE_TRIGGER的,但是过程本身并没有做任何这些事情。这是一个简单的写入过程,它接受XML参数并将值插入到一组表中。有一件不寻常的事情(对我们来说)是,它使用的WITH XMLNAMESPACES,但这似乎是奇怪的问题。
免责声明:我正在立即解决这个问题。我必须相信最初的开发人员,他们也没有试图创建一个对象,作为他们在数据库之上的代码的一部分(他们说是这样的)。我还在检查正在写入的所有表,以确保它们没有奇怪的触发器,试图做一些他们不应该做的事情。到目前为止,我还无法在测试环境中复制这种效果,即使是在模拟具有最小访问权限的用户时。它位于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.显然,其中一个嵌套procs有可能使用sp_send_dbmail ( fwiw,因为它不止一次地破坏了Exchange服务器)。
就是这样。一旦我向开发人员展示了正在发生的事情,他们就会意识到他们只需要稍微不同地调用一个方法,这就避免了这个问题。
发布于 2018-04-03 17:38:55
对于标题中的问题:我要说不。其他的事情正在发生,迫使DDL触发器开火。
您应该(至少是暂时的) 更改DDL触发器以存储EVENTDATA()输出到表,这样您就可以检查应用程序在调用这个存储过程时还发送了什么。必须要发送额外的DDL,例如ALTER或DROP/CREATE,因为DDL触发器(根据定义)不能仅仅通过执行本身不发出DDL命令的存储过程来触发。
您可能也希望设置服务器端跟踪,将其过滤到此应用程序,以便您可以看到除了对存储过程的调用之外,它还可能发送给服务器的其他内容,因为有可能它正在做一些他们不知道的事情。信任但要验证。
https://dba.stackexchange.com/questions/202940
复制相似问题