Auditoria de indices

Bom, ja fazia um tempo que eu não postava nada, isso se deve ao fato de que estava estudando para as certificações microsoft e Oracle (Cuja qual ainda não fiz a prova), todo caso, este post se diz respeito em um contexto mais amplo sobre triggers DML, em contexto micro, auditoria de indices.
Os indices são importantes para a performance de uma query, porem muito deles podem ser extremamente prejudiciais, não entrarei nos detalhes de indice neste post, porem, quando uma base esta 100% em bom funcionamento, é comum não se criar ou dropar indices, pode se sim barra o drop de indice, porem impossibilitar esta ação não é muito ruim, pois voce estara ingessando um processo importante, que possa ser necessario naquele exato momento.
Dito isso, o melhor em minha opnião é criar uma trigger que faça um audit detalhado do drop de indice, abaixo segue o script.

–CRIA TABELA DE AUDITORIA

CREATE TABLE Log_DBObjetos
(
	ID_EVENTO      integer IDENTITY (1,1) ,
	HOST_NAME      varchar(100) NULL ,
	LOGIN_NAME     varchar(100) NULL ,
	CLIENT_NET_ADDRESS varchar(15) NULL ,
	EVENT_DATE     datetime   NULL ,
	EVENT_TYPE     varchar(50) NULL ,
	OBJECT_NAME     varchar(100) NULL ,
	DB_NAME       varchar(20) NULL,
	OBJECT_TYPE     varchar(20) NULL,
	TABELA			varchar(5000) null

)

–CRIA TRIGGER PARA AUDITAR

create trigger Index_Audit
  ON database
for drop_index, create_index, alter_index
as
  declare @data xml
set @data = EVENTDATA()

SET NOCOUNT ON

Insert Into [Log_DBObjetos]
		  (HOST_NAME, LOGIN_NAME, CLIENT_NET_ADDRESS, EVENT_DATE, EVENT_TYPE, OBJECT_NAME, DB_NAME, OBJECT_TYPE, TABELA)
		Select Distinct
			  Host_Name, 
			  Login_Name,
			  Client_Net_Address,
			  getdate() as DataAtual,
			  @data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)') as EventType, 
			  @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(256)') as ObjectName,
        db_name() as DBName,
			  @data.value('(/EVENT_INSTANCE/ObjectType)[1]', 'varchar(256)') as ObjectType,
			  @data.value('(/EVENT_INSTANCE/TargetObjectName)[1]', 'nvarchar(2000)') as TSQL
		 from sys.dm_exec_sessions
			  Inner Join sys.dm_exec_connections On sys.dm_exec_sessions.Session_Id = sys.dm_exec_connections.Session_Id
		 Where sys.dm_exec_connections.Session_Id = @@SPID
		Order by Login_Name, Host_Name


Anúncios
Post a comment or leave a trackback: Trackback URL.

Trackbacks

  • […] triggers DDL? Existem muitas respostas para essa pergunta, inclusive uma dela pode ser encontrada aqui neste meu outro artigo , no caso este artigo, contem alguas outras informações que serão discutidas no proximo posts […]

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: