welington_quatro14 Aprendiz

Registrado: Quinta-Feira, 26 de Julho de 2012 Mensagens: 139
|
Enviada: Ter Set 19, 2017 2:41 pm Assunto: Listar query que ocasiou o locked |
|
|
Boa tarde.
Estou tentando alguns problemas de locked em alguns usuarios, e comecei a desenvolver um útil que lista as sessões e ids que alocam o banco por determinado tempo.
Via banco eu sei que pegando o ID da sessão e fazer o comando:
onstat -g sql "id" lista a ultima query executada na sessão.
Porém, eu preciso fazer isso via aplicação. Alguém tem alguma ideia?
Até o momento tenho isso:
Código: | procedure TfrmTimerLocked.ExecutaQuery;
var
vQry: TQuery;
vHandle: THandle;
begin
try
vQry := TQuery.Create(Application);
vQry.DatabaseName := _DATABASENAME;
try
vQry.ParamCheck := False;
vHandle := GetActiveWindow;
with vQry do
begin
SQL.Clear;
SQL.Add('drop table lcktab');
try
ExecSQL;
except
end;
Close;
SQL.Clear;
SQL.Add('select a.us_sid wsid, a.us_name wname, d.us_sid osid, d.us_name oname');
SQL.Add(' from sysmaster:sysuserthreads a, sysmaster:systxptab b, sysmaster:syslcktab c, sysmaster:sysuserthreads d');
SQL.Add(' where sysmaster:bitval(a.us_flags,"0x4") = 1');
SQL.Add(' and a.us_lkwait = c.address');
SQL.Add(' and c.owner = b.address');
SQL.Add(' and b.owner = d.us_address');
SQL.Add(' into temp lcktab');
ExecSQL;
SQL.Clear;
SQL.Add('drop table lcktab2');
try
ExecSQL;
except
end;
SQL.Clear;
SQL.Add('select b.osid, b.wsid bwsid, a.wsid awsid');
SQL.Add(' from lcktab b left outer join lcktab a');
SQL.Add(' on a.osid = b.wsid');
SQL.Add(' order by 1');
SQL.Add(' into temp lcktab2');
ExecSQL;
SQL.Clear;
SQL.Add('select osid session, bwsid waitlist, awsid');
SQL.Add(' from lcktab2');
SQL.Add(' where awsid is not null');
SQL.Add(' or (( awsid is null) and (bwsid not in');
SQL.Add(' (select awsid from lcktab2 where awsid is not null)))');
Open;
if (not vQry.IsEmpty) then
begin
First;
while (not vQry.Eof) do
begin
mmTimer.Lines.Add('Data: ' + DateTimeToStr(Now));
mmTimer.Lines.Add('Session: ' + vQry.FieldByName('session').AsString);
mmTimer.Lines.Add('Waitlist: ' + vQry.FieldByName('waitlist').AsString);
mmTimer.Lines.Add('Awsid: ' + vQry.FieldByName('awsid').AsString);
mmTimer.Lines.Add(EmptyStr);
Next;
end;
end;
{Display # of locks held by session}
SQL.Clear;
SQL.Add('select osid session, count(osid) locks');
SQL.Add(' from lcktab2');
SQL.Add(' where awsid is not null');
SQL.Add(' or ((awsid is null)');
SQL.Add(' and (bwsid not in');
SQL.Add(' (select awsid');
SQL.Add(' from lcktab2');
SQL.Add(' where awsid is not null)))');
SQL.Add(' group by osid');;
Open;
if (not vQry.IsEmpty) then
begin
First;
while (not vQry.Eof) do
begin
mmTimer.Lines.Add('Data: ' + DateTimeToStr(Now));
mmTimer.Lines.Add('Session: ' + vQry.FieldByName('session').AsString);
mmTimer.Lines.Add('Locks: ' + vQry.FieldByName('locks').AsString);
mmTimer.Lines.Add(EmptyStr);
Next;
end;
end;
end;
mmTimer.Lines.Add(DateTimeToStr(Now) + ' - Em execução ...');
finally
FreeAndNil(vQry);
end;
except
on E: Exception do
begin
mmTimer.Lines.Add('ERRO: ExecutaQuery');
tmrLocked.Enabled := False;
raise ETraceException.Create('TfrmTimerLocked.ExecutaQuery', E);
end;
end;
end; |
Com isso, consigo o ID e a sessão que alocou no banco de dados.
Agora quero listar a query que alocou, assim que der lock no banco de dados.
Alguém pode me ajudar?
Muito obrigado a todos, desde já. |
|