Array
(
)

Descobrir comando SQL

Robertolucio
   - 09 set 2004

Bom dia,

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

Marcus.magalhaes
   - 09 set 2004

Bom dia Justino.

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.:

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

Att,

Robertolucio
   - 09 set 2004

Oi Marcus,

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

Robertolucio
   - 09 set 2004

Em tempo,

É possível descobrir o IP da máquina que está executando o camando?

Att,

Roberto

Marcus.magalhaes
   - 09 set 2004

Boa noite Justino.

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.

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

Experimente tb executar o delete de outra conexão!!!

Ah, qto ao IP, até onde eu sei não é possível.

Att,

Marcus.magalhaes
   - 09 set 2004

Boa noite Justino.

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.

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

Experimente tb executar o delete de outra conexão!!!

Ah, qto ao IP, até onde eu sei não é possível.

Att,

Robertolucio
   - 10 set 2004

Boa noite Marcus,

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.