Estou tendo um problema em que, de forma intermitente, um procedimento armazenado está causando o disparo de um gatilho de banco de dados. O gatilho é para CREATE_FUNCTION, CREATE_PROCEDURE, CREATE_TABLE, CREATE_VIEW, CREATE_TRIGGER
, mas o procedimento em si não faz nenhuma dessas coisas. É um procedimento de gravação direto que usa um parâmetro XML e insere os valores em um conjunto de tabelas. A única coisa que é incomum (para nós) é que está usando WITH XMLNAMESPACES
, mas parece estranho que esse seja o problema.
Isenção de responsabilidade: Estou resolvendo este problema de uma vez removido. Estou tendo que confiar nos desenvolvedores originais que eles também não estão tentando criar um objeto como parte de seu código acima do banco de dados (eles dizem que é o caso). Também estou verificando todas as tabelas que estão sendo gravadas agora para garantir que elas não tenham gatilhos estranhos que tentem fazer algo que não deveriam. Até agora, não consegui duplicar o efeito em um ambiente de teste, mesmo ao representar um usuário com acesso mínimo. Isso está em um servidor SQL Server 2014.
Esse problema veio à tona porque o objetivo do gatilho do banco de dados é apenas permitir que o login "build" crie objetos no banco de dados.
Então, para manter minha pergunta estreita, é possível WITH XMLNAMESPACES
ser o problema aqui?
ATUALIZAÇÃO: Como acompanhamento, consegui obter as informações necessárias. Parece que o erro estava sendo causado porque o código de chamada, depois de chamar o procedimento armazenado em questão, também chamou:
exec sp_describe_first_result_set N' EXEC usp_Problem_procedure @P1 ',N'@P1 xml'
E parece que isso é o que realmente está causando o erro. Também parece que o gatilho não foi o único problema. Mesmo corrigir ou desabilitar o gatilho causou um erro posterior:
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.
Aparentemente, um dos procs aninhados tem o potencial de usar sp_send_dbmail (desencorajamos isso, fwiw, pois destruiu o servidor Exchange mais de uma vez).
Então é isso. Assim que mostrei aos desenvolvedores o que estava acontecendo, eles reconheceram que só precisavam chamar um método um pouco diferente, e isso evitou o problema.
À pergunta do título: vou dizer NÃO . Algo mais está acontecendo para forçar o gatilho DDL a disparar.
Você deve (pelo menos temporariamente) alterar o gatilho DDL para armazenar a
EVENTDATA()
saída em uma tabela para poder examinar o que mais o aplicativo está enviando ao chamar esse procedimento armazenado. Deve haver DDL adicional que está sendo enviado, como umALTER
ouDROP
/CREATE
, porque um gatilho DDL não pode - por definição - ser disparado simplesmente da execução de um procedimento armazenado que não emite comandos DDL.Você também pode configurar um rastreamento do lado do servidor, filtrado para este aplicativo, para que possa ver o que mais ele pode estar enviando para o servidor além da chamada para o procedimento armazenado, pois há uma chance de ele estar fazendo algo eles não sabem. Confie mas verifique.