Eu nunca trabalhei no SQL Server 2000 e recebi um requisito para verificar a captura das seguintes informações em um banco de dados específico.
DBName CurrentDate SPID BatchDuration ApplicationName HostName LoginName SQLQuery
Tentei a consulta abaixo, mas em primeiro lugar ela não retornou nenhuma informação ou não atende ao requisito, pois não captura o ApplicationName e o SQL Text.
SELECT
DB_NAME(dbid) as dbName
, CURRENT_TIMESTAMP as CurrentDate
, P.spid
, right(convert(varchar,
dateadd(ms, datediff(ms, P.last_batch, getdate()), '2000-01-01'),
121), 12) as 'batch_duration'
, P.program_name
, P.hostname
, P.loginame
, P.cmd
from master.dbo.sysprocesses P
where P.spid > 50
and P.status not in ('background', 'sleeping')
and P.cmd not in ('AWAITING COMMAND'
,'MIRROR HANDLER'
,'LAZY WRITER'
,'CHECKPOINT SLEEP'
,'RA MANAGER')
and DB_NAME(dbid) ='master'
order by batch_duration desc
Além disso, quando tento configurar este script via SQL Agent, ele só permite executá-lo a cada intervalo de um minuto. Existe alguma outra maneira melhor de executá-lo a cada 5 segundos? ou talvez eu deva usar outro método, por exemplo, capturando os logins com as informações necessárias via gatilho?
Qualquer entrada será apreciada.
Encontrei uma solução online: http://strictlysql.blogspot.com/2010/07/lock-monitoring-sql-server-2000.html . Modificou o script para atender ao meu requisito.
Criamos uma tabela em nosso banco de dados de monitoramento:
CREATE TABLE MyDBMonitoring ( DatabaseName varchar(35), Time datetime, SPID INT, Query varchar(1000), QueryStatus VARCHAR(35), LoginName VARCHAR(50), HostName VARCHAR(50), LastBatch datetime, Command VARCHAR(50), ProgramName VARCHAR(100), OpenTransactions INT
)
Modifiquei o script do link e selecionei apenas os campos que preciso e inseri o resultado na tabela de monitoramento configurando um SQL Agent Job no Servidor. Fornecerá o resultado ao cliente em dois dias.
CREATE TABLE #sp_lock_details ( spid INT, dbid INT, objid INT, indid INT, TYPE VARCHAR(100), resource VARCHAR(1000), mode VARCHAR(10), status VARCHAR(50) )
INSERT INTO #sp_lock_details EXEC Sp_lock
DECLARE @id INT DECLARE @max INT DECLARE @spid INT DECLARE @exec_qry VARCHAR(500) DECLARE @monitored_dt DATETIME
SET @monitored_dt = Getdate()
CREATE TABLE [#sysproc] ( id INT IDENTITY(1, 1), [spid] [SMALLINT] NOT NULL, [dbname] NVARCHAR COLLATE sql_latin1_general_cp1_cs_as NULL, [cpu] [INT] NOT NULL, [memusage] [INT] NOT NULL , [status] NCHAR COLLATE sql_latin1_general_cp1_cs_as NOT NULL, [loginame] NCHAR COLLATE sql_latin1_general_cp1_cs_as NOT NULL, [hostname] NCHAR COLLATE sql_latin1_general_cp1_cs_as NOT NULL, [lastwaittype] NCHAR COLLATE sql_latin1_general_cp1_cs_as NOT NULL, [last_batch] [DATETIME] NOT NULL, [cmd] NCHAR COLLATE sql_latin1_general_cp1_cs_as NOT NULL, [program_name] NCHAR COLLATE sql_latin1_general_cp1_cs_as NOT NULL, QUERY VARCHAR(500), open_tran INT ) ON [PRIMARY]
CREATE TABLE #dbccinfo (eventype VARCHAR(255), param INT, eventinfo VARCHAR(255) )
INSERT INTO #sysproc (spid, dbname, cpu, memusage, status, loginname, hostname, lastwaittype, last_batch, cmd, program_name, open_tran) SELECT spid, Db_name(MASTER.dbo.sysprocesses.dbid) AS dbname, cpu, memusage, status , loginname, hostname, lastwaittype, last_batch, cmd, program_name, open_tran FROM MASTER.dbo.sysprocesses WHERE spid > 50
SET @max = @@IDENTITY SET @id = 1
WHILE ( @id <= @max ) BEGIN SELECT @spid = spid FROM #sysproc WHERE id = @id
FIM
INSERT INTO dba.dbo.MyDBAMonitoring ( DatabaseName, Time, SPID, Query, QueryStatus, LoginName, HostName, LastBatch, Command, ProgramName, OpenTransactions ) SELECT dbname AS DatabaseName, CURRENT_TIMESTAMP AS 'TIME', #sysproc.spid AS SPID, QUERY, #sysproc.status AS query_status, loginname, hostname, last_batch, cmd, program_name, open_tran FROM #sysproc, #sp_lock_details WHERE #sp_lock_details.spid = #sysproc.spid e dbname = 'ODS;
DROP TABLE #dbccinfo DROP TABLE #sysproc DROP TABLE #sp_lock_details