Descobrir comando SQL
09/09/2004
0
Na sysprocesses existe o campo ´cmd´ que, acredito, guarda o último comando sql executado.
Se tento recuperar o dito cujo através de um select, ele retorna o próprio select.
Existe alguma forma de recuperar o último comando (que não seja o select)?
No Query Analyser quando ativo a opção Show_Server Trace (CTRL+SHIFT+T) ele me mostra, dentre outras coisas, os comandos T-SQL do script.
Existe alguma forma de recuperar esses comandos ?
Tentei através do DBCC INPUTBUFFER, mas como consigo ´jogar´ o resultado para uma variável?
Desde já obrigado.
[]´s
Roberto
Robertolucio
Posts
09/09/2004
Marcus.magalhaes
Na sysprocesses, vc somente recupera o último comando dado pela conexão, se for a sua, com certeza será o select que está em execução.
Para vc conseguir armazenar o resultado do DBCC INPUTBUFFER vc deve utilizar uma tabela, ex.:
[color=green:25774e04d0]Create Table teste
(
EventtypeNVarChar(30)NOT NULL,
ParametersIntNOT NULL,
EventInfoNVarChar(255)NOT NULL
)
GO
Declare @var_comandoVarChar(255),
@var_conexaoInt
Set @var_conexao = 51 -- Conexao de exemplo
Set @var_comando = ´DBCC INPUTBUFFER(´ + Convert(VarChar, @var_conexao) + ´)´
Insert Into teste
Exec (@var_comando)
Select *
From teste
GO
Drop table teste
GO[/color:25774e04d0]
Att,
09/09/2004
Robertolucio
Obrigado pela resposta, e se não for abusar, vou te pedir mais uma ´ajudinha´, hehehe.
O meu objetivo é conseguir ´rastrear´ através de Trigger que está apagando o conteúdo das tabelas. Sei dos procedimentos de segurança que devo adotar, mas gostaria de descobrir o responsável por isso.
Na minha trigger, eu mapeio a placa de rede, nome da estação, data e hora e o tipo da ação executada (Insert, Delete ou Update), e gostaria de gravar também o comando sql que o cidadão está executando.
É possível
Att,
Roberto
09/09/2004
Robertolucio
É possível descobrir o IP da máquina que está executando o camando?
Att,
Roberto
09/09/2004
Marcus.magalhaes
Utilize este código como referencia, nele vc consegue pegar o comando delete executado, saber o nro da conexão, o nome do usuário, os dados da máquina (sysprocesses) e os dados deletados da tabela.
[color=green:492451f632]Create Table teste_db
(
Eventtype NVarChar(30) NOT NULL,
Parameters Int NOT NULL,
EventInfo NVarChar(255) NOT NULL
)
GO
create table teste
(
col1int,
col2char(10)
)
GO
Create trigger tr_teste on teste for delete
As
Declare @var_comando VarChar(255),
@var_conexao Int
Set @var_conexao = @@spid
Set @var_comando = ´DBCC INPUTBUFFER(´ + Convert(VarChar, @var_conexao) + ´)´
Insert Into teste_db
Exec (@var_comando)
Select *
From teste_db
Select suser_sname()
Select * From master..sysprocesses where spid = @@spid
Select * From deleted
GO
Insert Into teste (col1, col2) values (1, ´teste1´)
Insert Into teste (col1, col2) values (2, ´teste2´)
Insert Into teste (col1, col2) values (3, ´teste3´)
Insert Into teste (col1, col2) values (4, ´teste4´)
Insert Into teste (col1, col2) values (5, ´teste5´)
Insert Into teste (col1, col2) values (6, ´teste6´)
GO
delete
from teste
where col1 = 1
[/color:492451f632]
Experimente tb executar o delete de outra conexão!!!
Ah, qto ao IP, até onde eu sei não é possível.
Att,
09/09/2004
Marcus.magalhaes
Utilize este código como referencia, nele vc consegue pegar o comando delete executado, saber o nro da conexão, o nome do usuário, os dados da máquina (sysprocesses) e os dados deletados da tabela.
[color=green:a1153fe8e7]Create Table teste_db
(
Eventtype NVarChar(30) NOT NULL,
Parameters Int NOT NULL,
EventInfo NVarChar(255) NOT NULL
)
GO
create table teste
(
col1int,
col2char(10)
)
GO
Create trigger tr_teste on teste for delete
As
Declare @var_comando VarChar(255),
@var_conexao Int
Set @var_conexao = @@spid
Set @var_comando = ´DBCC INPUTBUFFER(´ + Convert(VarChar, @var_conexao) + ´)´
Insert Into teste_db
Exec (@var_comando)
Select *
From teste_db
Select suser_sname()
Select * From master..sysprocesses where spid = @@spid
Select * From deleted
GO
Insert Into teste (col1, col2) values (1, ´teste1´)
Insert Into teste (col1, col2) values (2, ´teste2´)
Insert Into teste (col1, col2) values (3, ´teste3´)
Insert Into teste (col1, col2) values (4, ´teste4´)
Insert Into teste (col1, col2) values (5, ´teste5´)
Insert Into teste (col1, col2) values (6, ´teste6´)
GO
delete
from teste
where col1 = 1
[/color:a1153fe8e7]
Experimente tb executar o delete de outra conexão!!!
Ah, qto ao IP, até onde eu sei não é possível.
Att,
10/09/2004
Robertolucio
Excelente o teu código, funcionou em todos os testes que fiz, tanto no QA e no OSQL, mas quando executei sob uma aplicação comercial, o conteúdo retornado foi o seguinte:
id Tipo_Evento Parametros Comando
--- -------------- --------------- ---------------
1 RPC Event 0 sp_prepexec;1
2 RPC Event 0 sp_prepexec;1
No BOL não encontrei referência a sp_prepexec, e essa procedure não permite a visualização do código para eu poder saber o que ela faz. Na internet o que encontrei diz que ela é referente ao ODBC.
Pergunta, e é ela que ´conversa´ com o ODBC? Se sim, existe uma maneira de eu filtrar o seu conteúdo?
Att,
Roberto
PS: Alterei o teu código para incluir um campo de autoincremento.
Clique aqui para fazer login e interagir na Comunidade :)