none
Retornar o nome de uma procedure em trigger RRS feed

  • Pergunta

  • Bom dia pessoal.

    Estou com uma dúvida que procurei aqui no fórum e não encontrei.

    Estou fazendo um sistema de logs de operações em algumas tabelas do meu sistema.
    Criei uma tabela genérica para armazenar os logs e coloco triggers em cada tabela que quero monitorar. Até ai tranquilo, tudo funcionando perfeitinho.

    Porem quero gravar no log qual a stored procedure que realizou a operacao na tabela monitorada. Pensei até em gravar no registro o nome da procedure mas nao acho que seja um solucao recomendada.

    Existe algum campo da tabela inserted ou deleted que retorne qual foi a procedure que realizou a mudanca ou alguma função que faça isso?

    Outra coisa, para identificar a tabela uso o object_id e ele me retorna o id... Nao existe outra funcao que me retorne o nome da tabela?

    Muito obrigado!
    segunda-feira, 21 de julho de 2008 12:40

Respostas

  • Bom Dia,

     

    Esse assunto já foi discutido no fórum, mas certamente você não encontrou a resposta por que não é possível na trigger de descobrir qual foi a SP que disparou o evento. Isso só é possível via Profiler ou se você realmente gravar o nome na tabela.

     

    A função object_name retorna o nome de um objeto se você passar o ID como parâmetro.

     

    [ ]s,

     

    Gustavo

     

    segunda-feira, 21 de julho de 2008 13:06

Todas as Respostas

  • Bom Dia,

     

    Esse assunto já foi discutido no fórum, mas certamente você não encontrou a resposta por que não é possível na trigger de descobrir qual foi a SP que disparou o evento. Isso só é possível via Profiler ou se você realmente gravar o nome na tabela.

     

    A função object_name retorna o nome de um objeto se você passar o ID como parâmetro.

     

    [ ]s,

     

    Gustavo

     

    segunda-feira, 21 de julho de 2008 13:06
  • Hummm..

    Beleza Gustavo! Muito obrigado pela resposta!
    Acho que vou fazer pelo registro mesmo!

    []'s
    segunda-feira, 21 de julho de 2008 13:13
  • Rip,

     

    Se eu não estiver errado, a table Inserted e Deleted são criado na execução da Trigger e contem a mesma estrutura da table ao qual o trigger esta associado, sendo assim, não deverá existir outros campos nas tables que possam ser especificos da trigger.

     

    Mas vou procurar alguma informação.

    segunda-feira, 21 de julho de 2008 13:16
  • Bom Dia,

     

    A observação do Jr. é bem pertinente. É possível no entanto capturar o nome do objeto executante (function, triggers e stored procedures) através da variável @@procid. O problema é que quando essa variável é executada dentro da trigger, ele retorna o nome da trigger e não da SP.

     

    [ ]s,

     

    Gustavo

     

    segunda-feira, 21 de julho de 2008 13:30
  • Gustavo,

     

    Isso mesmo, eu fiz um teste aqui com system variable @@ProcID, o que foi retornando é o nome da Trigger, pois o ID corresponde ao objeto que esta sendo processado em primeiro plano.

    segunda-feira, 21 de julho de 2008 13:51
  • Júnior e Gustavo,

    Obrigado pelas informações.

    Bom o que eu fiz foi exatamente pegar o @@PROCID na procedure executante e gravar em uma nova coluna na tablea monitorada.
    entao na procedure executante fica:

            update TABELA
            set coluna1 = valor + 1, coluna2 = OBJECT_NAME(@@PROCID)

    Exemplo bem simples....
    E na trigger da TABELA fica facil para gravar na tabela de log o valor da coluna 2.

    Obrigado a todos!

    segunda-feira, 21 de julho de 2008 14:16