SQL Server Basico 5 – Triggers

Triggers, quando traduzidas, querem dizer gatilhos, gatilhos são disparados, no caso de uma trigger, por evento, uma trigger pode disparar por a exemplo:

Contexto de tabela
– A cada insersão
– A cada deleção
– A cada atualização

Contexto de instancia
– Cada logon
– Cada criação ou deleção de uma tabela

Portanto, tendo conhecimentos dessas 2 possiveis opções, neste post, irei falar apenas sobre Triggers de tabelas.

Trigger de tabela:
Ira disparar quando algo acontecer em relação a aqueles dados, seja um insert, update ou delete, algumas pessoas podem pensar que é possivel auditar o drop de uma tabela a partir da criação de uma trigger na mesma, mas não é, por que:
Uma tabela -> (Contem) -> Dados, portanto, audita-se apenas dados.
Triggers neste contexto existem para assegurar a validade de seus dados por todo o ambiente, uma vez que estamos falando de um ambiente normalizado automatizando algumas tarefas para evitar retarefa, por exemplo:

SITUAÇÃO
– Existe uma tabela chamada USUARIOS, que contem todos os usuarios da empresa.
– Uma outra tabela denominada EMPRESA, que contem o cargo de cada pessoa dentro da empresa.
– O que aconteceria quando um funcionario fosse demitido e seu nome removido da tabela usuarios?
Basicamente ele deveria ter de ser removido tambem da tabela empresa, uma vez que ele não pertence mais a organização. Talveza melhor opção seja a criação de uma procedure contendo a deleção deste usuario das duas tabelas, porem, mesmo todo o processo mascarado por traz de uma procedure, dentro da mesma, ainda serão executadas 2 deleções, portanto, alguem teve que programar as 2 deleções. Com a utilização de trigger, seria possivel realizar apenas uma, e deixar a trigger realizar essa deleção.
Quando estamos falando de procedure, temos 2 tabelas especiais criadas em tempo de execução das queries que podemos utilizar para capturar os dados sejam eles inseridos ou deletados, quando estamos falando de uma insersão de dados, podemos utilizar a tabela INSERTED, e ela contem exatamente os mesmos campos da tabela em questão, ja para deleção de dados, temos a DELETED, que tambem contem os mesmos campos, quando falamos de update, temos as 2, uma vez que um update é composto de uma deleção + uma insersão.

Representação do exemplo acima com insersão:

--CRIAÇÃO DAS TABELAS
CREATE TABLE Usuarios
(
	Usuario VARCHAR(100),
	Senha	VARCHAR(100)

)

CREATE TABLE Empresa
(
	Nome	VARCHAR(100),
	Cargo	VARCHAR(100)
)

--CARGA DE DADOS
INSERT INTO Usuarios VALUES
('Fabrizzio','Fabri'),
('Giovanni','gio'),
('Camila','Cam')

INSERT INTO Empresa VALUES
('Fabrizzio','Gerente'),
('Giovanni','Coordenador'),
('Caimla','Diretora')

--CRIAÇÃO DA TRIGGER DE INSERSÃO
CREATE TRIGGER T_Insert ON Usuarios
FOR INSERT
AS
DECLARE @Usuario VARCHAR(100)
SET @Usuario = (SELECT Usuario FROM INSERTED)
INSERT INTO Empresa VALUES (@Usuario, NULL)

--PRIMEIRO SELECT DE TESTE
SELECT * FROM Usuarios
/*
Fabrizzio	Fabri
Giovanni	gio
Camila	Cam
*/

SELECT * FROM Empresa
/*
Fabrizzio	Gerente
Giovanni	Coordenador
Caimla	Diretora
*/

--INSERSÃO DE TESTE
INSERT INTO Usuarios VALUES ('Marco','DBA')

--SEGUNDO SELECT DE TESTE
SELECT * FROM Usuarios
/*
Fabrizzio	Fabri
Giovanni	gio
Camila	Cam
Marco	DBA
*/

SELECT * FROM Empresa
/*
Fabrizzio	Gerente
Giovanni	Coordenador
Caimla	Diretora
Marco	NULL
*/

Representação do exemplo acima com deleção:

--CRIAÇÃO DE TRIGGER DE DELEÇÃO
CREATE TRIGGER T_Delet ON Usuarios
FOR DELETE
AS
DECLARE @Usuario VARCHAR(100)
SET @Usuario = (SELECT Usuario FROM DELETED)
DELETE FROM Empresa WHERE Nome LIKE @Usuario

--PRIMEIRO SELECT DE TESTE
SELECT * FROM Usuarios
/*
Fabrizzio	Fabri
Giovanni	gio
Camila	Cam
Marco	DBA
*/

SELECT * FROM Empresa
/*
Fabrizzio	Gerente
Giovanni	Coordenador
Caimla	Diretora
Marco	NULL
*/

--DELEÇÃO DE UMA LINHA DA TABELA USUARIOS
DELETE FROM Usuarios WHERE Usuario LIKE 'Marco'

--SEGUNDO SELECT DE TESTE
SELECT * FROM Usuarios
/*
Fabrizzio	Fabri
Giovanni	gio
Camila	Cam
*/

SELECT * FROM Empresa
/*
Fabrizzio	Gerente
Giovanni	Coordenador
Caimla	Diretora
*/

Claro, que neste caso, a performance da trigger seria pior do que em uma procedure aonde o comando seria executado na propria tabela e não ao disparar de uma trigger, portanto, trigger nem sempre são recomendadas e podem sim serem evitadas, porem, existem muitos sistemas aonde grande parte de integridade dos dados é feita via trigger, outro, aonde o uso de trigger é mais consciente, pense em um software aonde é proibido mexer em seu banco de dados, hoje em dia isso é bem comum, e tudo deve ser feito atravez de telas de sistemas, vamos supor que essas telas chamem procedures, que são responsaveis pela integridade dos dados, a empresa que criou e vendeu o software, pode sim criar uma trigger e fazer com que a mesma não seja disparada caso a ação que a disparou seja a procedure, desta forma, alem de manter a segurança dos dados pela proibição de se mexer do usuario, caso ele altere alguma coisa, não havera falta de integridade dos dados.

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

Comentários

  • fabadas  On 22/11/2011 at 13:16

    Cara parabens, esse post sobre triggers me abriu muito a cabeça, lógico que não quebrou minha cabeça, kkk, mas foi ótimo que tirou muitas dúvidas e ainda me abriu possibilidades nas minhas bases, obrigado.

    • fabrizziocaputo  On 22/11/2011 at 13:28

      Fabio,

      Que bom cara, fico feliz, semana que vem pretendo continuar este post sobre trigger, espero que voce tambem goste =)

Trackbacks

  • […] é o segundo de uma seria de 3 posts sobre Trigger, o primeiro, que pode ser encontrado neste link, fala sobre triggers basicas de comandos DML, ou seja, insert, update e delete, este aqui, falarei […]

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: