Você está na página 1de 8

SQL - Triggers

Se at agora voc esta acostumado a trabalhar com banco de dados do tipo ISAM ( Dbase , FoxPro, Access , Paradox...); desenvolver uma aplicao para gerenciar os dados neste caso significa criar uma aplicao que faa o controle sobre todo ambiente desde a interface , passando pela manuteno dos dados e as regras de negcios do sistema. o sistema que deve controlar e tomar as decises sobre o que fazer em determinadas situaes. Assim em um programa para controlar os produtos de uma empresa quando a quantidade de um produto atingir uma certa quantidade o sistema dever avisar o operador/usurio para providenciar a reposio do mesmo. Ao trabalhar com base de dados Cliente/Servidor como SQL Server , Oracle , Informix , dentre outras, podemos usar um recurso muito poderoso chamado Trigger. Um Trigger bloco de comandos Transact-SQL que automaticamente executado quando um comando INSERT , DELETE ou UPDATE for executado em uma tabela do banco de dados. Os Triggers so usados para realizar tarefas relacionadas com validaes , restries de acesso , rotinas de segurana e consistncia de dados ; desta forma estes controles deixam de ser executados pela aplicao e passam a ser executados pelos Triggers em determinadas situaes : Mecanismos de validao envolvendo mltiplas tabelas Criao de contudo de uma coluna derivada de outras colunas da tabela Realizar anlise e e atualizaes em outras tabelas com base em alteraes e/ou inclues da tabela atual

A criao de um Trigger envolve duas etapas :

1. 2.

Um comando SQL que vai disparar o Trigger ( INSERT , DELETE , UPDATE) A ao que o Trigger vai executar ( Geralmente um bloco de cdigos SQL )

Como no poderia deixar de ser , existem certas limataes na utilizao de um Trigger : No possivel criar um Trigger para uma viso O resultado da execuo de um Trigger retornado para a aplicao que o chamou. O comando WRITETEXT no ativa um Trigger O comando TRUNCATE TABLE no pode ser reconhecido por um Trigger No podemos usar em um Trigger os seguintes comandos SQL : ALTER DATABASE , ALTER TRIGGER , ALTER PROCEDURE , ALTER TABLE , ALTER VIEW . CREATE DATABASE , CREATE INDEX , CREATE PROCEDURE, CREATE SCHEMA, CREATE TABLE , DROP DATABASE, DROP TABLE , DROP PROCEDURE, DROP TRIGGER, DROP INDEX, GRANT , LOAD DATABASE, REVOKE, RESTORE DATABASE, TRUNCATE TABLE.

Como criar um Trigger

Podemos criar um Trigger usando o comando Create Trigger do SQL Server ou atravs do Enterprise Manager. A Sintaxe de um Trigger a seguinte: CREATE TRIGGER trigger_name ON { table | view } [ WITH ENCRYPTION ] { { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] } [ WITH APPEND ] [ NOT FOR REPLICATION ] AS [ { IF UPDATE ( column ) [ { AND | OR } UPDATE ( column ) ] [ ...n ] | IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask ) { comparison_operator } column_bitmask [ ...n ] } ] sql_statement [ ...n ] } }

a. b. c. d. e.

ON Table - a tabela para o qual o trigger esta sendo criado FOR - deve ser seguido do tipo de comando que acionam o trigger AFTER - determina que o trigger somente sera disparado quando todas as rotinas especificadas no comando de disparo forem executadas com sucesso INSTEAD OF - Determina que o trigger ser executado ao invs do comando de disparo do mesmo. [ DELETE ] [INSERT] [UPDATE] - indicam o tipo de ao que deve disparar o trigger.

Quando voc for criar um Trigger dever definir :

1. 2. 3. 4.

O nome A Tabela para o qual o Trigger ir ser criado Quando o Trigger dever ser disparado Os comandos que determinam qual ao o Trigger dever executar

Exemplo de Triggers: 1- O trigger abaixo ser disparado quando algum tentar incluir ou alterar dados na tabela Titles. Ele emite uma mensagem ao usurio. ( 50009 uma mensagem definida para o usurio em sysmessages.) USE pubs IF EXISTS (SELECT name FROM sysobjects WHERE name = 'reminder' AND type = 'TR') DROP TRIGGER reminder GO CREATE TRIGGER reminder ON titles FOR INSERT, UPDATE AS RAISERROR (50009, 16, 10) GO

Criando um Trigger com o Enterprise Manager Vamos ver agora como criar um trigger usando o Enterprise Manager : Abra o Enterprise Manager e expanda o item banco de dados e a pasta onde esta a tabela que ser aberta. Clique com o boto direito do mouse no nome da tabela onde deseja criar o trigger e selecione no menu pop up a opo New Table Vamos criar a tabela tabela1 conforme a estrutura da figura 1. Na figura 2 temos a tabela j criada.

figura 1

figura 2

- Agora clique com o boto direito do mouse sobre a tabela para a qual deseja criar o trigger e no menu selecione : All Tasks e a seguir Manage Triggers, conforme abaixo

- A janela Triggers Properties ser exibida com a estrutura padro de um trigger.Agora faa o seguinte : Altere o contedo do colchete substituindo TRIGGER NAME pelo nome do trigger que esta criando

Na linha seguinte escolha o tipo de ao que ir disparar o trigger (INSERT, UPDATE, DELETE ) Abaixo da palavra AS informe a ao que o trigger ir realizar.

- Vamos criar o trigger chamado teste que emitir um aviso toda vez que um registro for incluido na tabela Tabela1. O desenho do nosso trigger dever ficar assim:

- Verifique a sintaxe clicando em - Check Syntax e a seguir salve o trigger clicando no boto OK.

Vamos agora testar se o trigger esta funcionando. Abra o Query Analyzer e selecione o banco de dados para o qual criou o trigger e digite na janela a instruo SQL para incluir um registro . Veja que assim que o registro incluido a mensagem - "Um registro foi incluido na tabela Tabela1" exibido indicando que o nosso trigger esta funcionando.

Para alterar um trigger usamos o comando ALTER TRIGGER : ALTER TRIGGER nome_trigger Para excluir um trigger usamos o comando DROP TRIGGER : DROP TRIGGER nome_trigger Por enquanto s isto.. At a prxima...

CREATE TRIGGER
Name
CREATE TRIGGER -- define um novo gatilho

Synopsis
CREATE TRIGGER nome { BEFORE | AFTER } { evento [OR ...] } ON tabela FOR EACH { ROW | STATEMENT } EXECUTE PROCEDURE funo ( argumentos )

Entradas
nome

O nome do novo gatilho.


tabela

O nome de uma tabela existente.


evento

Um entre INSERT, DELETE e UPDATE.


funo

Uma funo fornecida pelo usurio. Sadas


CREATE

Mensagem retornada se o gatilho for criado com sucesso.

Descrio
O comando CREATE TRIGGER introduz um novo gatilho no banco de dados atual. O gatilho fica associado com a relao tabela e executa a funo especificada funo. O gatilho pode ser especificado para disparar antes (BEFORE) da operao ser realizada na tupla (antes das restries serem verificadas e o INSERT, UPDATE ou DELETE serem efetuados) ou aps (AFTER) a operao ser realizada (ou seja, aps as restries serem verificadas e o INSERT, UPDATE ou DELETE ter completado). Se o gatilho disparar antes do evento, o gatilho pode evitar a operao para a tupla atual, ou modificar a tupla sendo inserida (para as operaes de INSERT e UPDATE somente). Se o gatilho disparar aps o evento todas as modificaes, incluindo a ltima insero, atualizao ou excluso, so "visveis" para o gatilho. O SELECT no modifica nenhuma linha, portanto no possvel criar gatilhos para SELECT. Regras e vises so mais apropriadas para este caso. Consulte os captulos sobre SPI (Interface de Programao do Servidor) e Gatilhos no Guia do Programador do PostgreSQL para obter mais informaes.

Notas
Para criar um gatilho em uma tabela, o usurio deve possuir o privilgio TRIGGER na tabela.

Na verso atual, gatilhos de declarao (STATEMENT triggers) no esto implementados. Consulte o comando DROP TRIGGER para obter informaes sobre como remover gatilhos.

Exemplos
Verificar se o cdigo do distribuidor existe na tabela de distribuidores antes de inserir ou atualizar uma linha da tabela filmes:
CREATE TRIGGER se_dist_existe BEFORE INSERT OR UPDATE ON filmes FOR EACH ROW EXECUTE PROCEDURE verificar_chave_primaria ('did', 'distribuidores', 'did');

Antes de remover um distribuidor, ou de atualizar o seu cdigo, remover todas as referncias para a tabela filmes:
CREATE TRIGGER se_filme_existe BEFORE DELETE OR UPDATE ON distribuidores FOR EACH ROW EXECUTE PROCEDURE verificar_chave_primaria (1, 'CASCADE', 'did', 'filmes', 'did');

O segundo exemplo tambm pode ser implementado usando uma chave estrangeira, como em:
CREATE TABLE distribuidores ( did DECIMAL(3), nome VARCHAR(40), CONSTRAINT se_filme_existe FOREIGN KEY(did) REFERENCES filmes ON UPDATE CASCADE ON DELETE CASCADE );

Compatibilidade
SQL92 No existe o comando CREATE SQL99 O comando CREATE TRIGGER do PostgreSQL implementa um subconjunto do padro SQL99. As seguintes funcionalidades esto faltando:
TRIGGER

no SQL92.

O SQL99 permite os gatilhos dispararem quando da atualizao de colunas especficas (por exemplo, AFTER UPDATE OF col1, col2). O SQL99 permite definir alis para as linhas ou tabelas "velha" e "nova" para uso na definio das aes do gatilho (por exemplo, CREATE TRIGGER ... ON nome_tabela
REFERENCING OLD ROW AS algum_nome NEW ROW AS outro_nome ...).

Como o PostgreSQL permite que os procedimentos dos gatilhos sejam escritos em qualquer linguagem definida pelo usurio, o acesso aos dados realizado na forma especfica da linguagem. O PostgreSQL somente possui gatilhos a nvel de linha, no possuindo gatilhos a nvel de declarao. O PostgreSQL somente permite a execuo de procedimentos armazenados para a ao do gatilho. O SQL99 permite a execuo de vrios outros comandos SQL, como o CREATE TABLE, para a ao de um gatilho. Esta limitao no difcil de ser contornada criando-se um procedimento armazenado que execute estes comandos.

Gatilho ou trigger um recurso de programao executado sempre que o evento associado ocorrer. Trigger um tipo especial de procedimento armazenado, que executado sempre que h uma tentativa de modificar os dados de uma tabela que protegida por ele. muito utilizada para ajudar a manter a consistncia dos dados ou para propagar alteraes em um determinado dado de uma tabela para outras. Um bom exemplo um gatilho criado para controle de quem alterou a tabela, nesse caso, quando a alterao for efetuada, o gatilho "disparado" e grava em uma tabela de histrico de alterao, o usurio e data/hora da alterao. Exemplo: (MS-SQL Server)
CREATE TRIGGER nome_do_gatilho ON dono.Nome_da_tabela FOR INSERT (ou UPDATE ou DELETE) AS Codigo para execucao [editar]