Como controlar os recursos utilizados por usuários no banco Informix
Muitas vezes há uma exigência para controlar quando os usuários logaram em um determinado banco de dados, quanto tempo eles acessaram o banco e os recursos que eles usaram. Esta informação pode ser usada para fins de auditoria ou cobrança pelo uso de um banco de dados os recursos consumidos pelo usuário.
O procedimento sysdbopen é executado sempre que os utilizadores emitir com sucesso o DATABASE ou CONNECT declaração para ligar explicitamente a um banco de dados onde os procedimentos são instalados. Você também pode criar o procedimento SPL sysdbclose, que é executado quando o usuário emite o CLOSE DATABASE ou declaração Desconectar para desconectar do banco de dados. O banco de dados sysmaster contém a interface de monitoramento de sistema (SMI) tabelas. As tabelas SMI fornecem informações sobre o estado do servidor de banco de dados. Você pode consultar essas tabelas para identificar gargalos de processamento, determinar o uso de recursos, a sessão de faixa ou atividade do servidor de banco de dados, e assim por diante.
Checando
sysdbopen
[teste:informix]$/export/home/informix> dbschema -d potencial -f sysdbopen
DBSCHEMA Schema Utility INFORMIX-SQL Version 11.70.FC2
No procedure sysdbopen.
sysdbclose
[teste:informix]$/export/home/informix> dbschema -d potencial -f sysdbclose
DBSCHEMA Schema Utility INFORMIX-SQL Version 11.70.FC2
No procedure sysdbclose.
Não existe nenhuma configuração nos banco para o public para os dois;
Criando a Tabela
Vamos criar uma tabela para armazenar todos os registros de conexão dos usuários e os recursos que eles consumiram. Esta tabela precisa ser criado no banco de dados que queremos monitorar as conexões de usuários.
CREATE TABLE connect_log
(
cl_id bigserial,
cl_login VARCHAR(32) DEFAULT USER,
cl_sid BIGINT,
cl_pid BIGINT,
cl_connect datetime YEAR TO SECOND
DEFAULT CURRENT YEAR TO SECOND,
cl_disconnect datetime YEAR TO SECOND
DEFAULT NULL,
cl_program varchar(255),
cl_hostname varchar(255),
cl_inserts BIGINT,
cl_updates BIGINT,
cl_deletes BIGINT,
cl_selects BIGINT,
cl_commits BIGINT,
cl_rollback BIGINT,
cl_sorts BIGINT,
cl_lgrecs BIGINT,
cl_numios BIGINT,
cl_iowait float,
cl_lockwait float,
cl_cputime float
) lock mode row;
Procedure - Grava a Hora de Conexão
Depois vamos criar um procedimento que insere um registro quando o usuário se conecta ao banco e quando o usuário sai é gravado a hora de saida.
DROP PROCEDURE IF EXISTS public.sysdbopen();
CREATE PROCEDURE public.sysdbopen()
SET ISOLATION TO DIRTY READ;
INSERT INTO connect_log
(cl_sid,cl_pid, cl_program,cl_hostname)
SELECT sid, pid, progname, hostname
FROM sysmaster:sysscblst
WHERE sid = DBINFO("sessionid");
END PROCEDURE;
Procedure - Grava a Hora de Desconexão
Por fim, crie o procedimento que será executado após o fechamento / desconexão de um banco de dados. Este procedimento irá atualizar a linha inserida no procedimento sysdbopen com o log out e sessões de estatísticas.
DROP PROCEDURE IF EXISTS public.sysdbclose();
CREATE PROCEDURE public.sysdbclose()
UPDATE connect_log
SET ( cl_disconnect, cl_inserts, cl_updates, cl_deletes,
cl_selects, cl_commits, cl_rollback, cl_sorts, cl_lgrecs,
cl_numios, cl_iowait, cl_lockwait, cl_cputime
) =
( ( SELECT CURRENT, upf_iswrite, upf_isrwrite, upf_isdelete,
upf_isread, upf_iscommit, upf_isrollback , upf_totsorts,
upf_lgrecs, upf_niowaits, iowaittime, lkwaittime , cpu_time
FROM sysmaster:sysrstcb R, sysmaster:systcblst T
WHERE sid = DBINFO("sessionid") AND R.tid = T.tid ) )
WHERE cl_sid = DBINFO("sessionid")
AND cl_disconnect IS NULL;
END PROCEDURE;
Checando quem Acessou o Banco
Depois de um tempo quero ver quem acessou este banco;
echo "select * from connect_log where NOT cl_login = 'informix' order by cl_id desc;" | dbaccess nome_do_banco
Resultado
cl_id 1
cl_login csa
cl_sid 46
cl_pid 27366
cl_connect 2014-02-19 15:30:45
cl_disconnect 2014-02-19 15:31:05
cl_program
cl_hostname teste
cl_inserts 1
cl_updates 0
cl_deletes 0
cl_selects 247
cl_commits 1
cl_rollback 0
cl_sorts 1
cl_lgrecs 6
cl_numios 2
cl_iowait 3.150230604645
cl_lockwait 0.00
cl_cputime 0.00485291622
Deletando
Se você não quiser mais monitorar é só deletar as procedures "public" que criamos;
public.sysdbopen
[teste:informix]$/export/home/informix/claudemar> echo "drop procedure "public".sysdbopen;" | dbaccess potencial
Database selected.
Routine dropped.
Database closed.
public.sysdbclose
[teste:informix]$/export/home/informix/claudemar> echo "drop procedure "public".sysdbclose;" | dbaccess potencial
Database selected.
Routine dropped.
Database closed.
Retirado - Clique Aqui
0 comentários:
Enviar um comentário