Triggers (Gatilhos) Professor Esp. Diego André Sant’Ana

Slides:



Advertisements
Apresentações semelhantes
O Comando DROP INDEX Para eliminar um índice definido sobre uma tabela, utilize: Drop Index on ; Ex: No Access: Drop Index X on.
Advertisements

Gerenciamento de Dados e Informação Estudo de caso – PL/SQL
Banco de Dados Aula 10 – SQL - DDL
Triggers Renata Viegas.
BANCO DE DADOS EM APLICATIVOS WEB Aula 13
Prof.: Bruno Rafael de Oliveira Rodrigues
Prof.: Bruno Rafael de Oliveira Rodrigues
Banco de Dados SQL TRIGGERS (Gatilhos)
SISTEMAS DE INFORMAÇÃO Sistemas de Bancos de Dados 2º Semestre – 2010 Pedro Antonio Galvão Junior Fone:
SISTEMAS DE INFORMAÇÃO Sistemas de Bancos de Dados 2º Semestre – 2010 Pedro Antonio Galvão Junior Fone:
SISTEMAS DE INFORMAÇÃO Sistemas de Bancos de Dados 2º Semestre – 2010 Pedro Antonio Galvão Junior Fone:
SISTEMAS DE INFORMAÇÃO Sistemas de Bancos de Dados II 1º Semestre – 2010 Pedro Antonio Galvão Junior Fone:
Projeto e Organização de BD
Maurício Edgar Stivanello
Sistema Gerenciador de Banco de Dados SGBD
PostGreSQL Primeiros Passos
Restrições de Integridade
Introdução à Engenharia da Computação
SCC Bancos de Dados e Suas Aplicações
SCC Bancos de Dados e Suas Aplicações
Operação de União “JOIN”
Linguagem de Banco de Dados - SQL
Triggers e StoreProcedures
Banco de dados Profª Kelly Medeiros.
PostgreSQL.
Equipe de monitoria Aula prática 4.  Tipos  Tabela de Objetos  Herança  Métodos  Referências  Coleções  Composição de coleções  Conectividade.
PL/SQL, Procedures e Funções
Monitoria GDI Aula Prática
Capítulo 6: Integridade e Segurança
Tipos de Linguagens do Banco de Dados
Equipe de monitoria Aula prática 3.  Caso de estudo  Igualando situações  Cursor  Function  Procedure  Trigger  Package  Surpresa...
Equipe de monitoria Aula prática 4
Primeira aula de PL/SQL Parte II
SEGUNDA FASE / S2B MIC PERNAMBUCO SEGUNDA FASE / S2B MIC PERNAMBUCO
Oracle 9i: SQL e PL/SQL Bruno Celso Cunha de Freitas
SEQUENCE, PROCEDURE, FUNÇÃO, TRIGGER
Desenvolvendo um script SQL
Rafael Lucio, Desenvolvedor Jr Padrão Informática e Assessor de TI Secretaria Municipal da Saúde;
VIEW - VISÕES Professor Esp. Diego André Sant’Ana
BANCOS DE DADOS ATIVOS Weyler M Lopes © Especialização em Banco de Dados.
Banco de dados.
Revisão ER /SQL / PL.
PostGres: Um Banco de Dados Orientado a Objetos
Monitoria GDI Aula Prática Aula 2: PL 1. Estudo de caso - continuação Pegar arquivo GDI.zip em Descompactar arquivo: o criacaoTabelas.SQL.
1 15/4/ :36 FMU – 1. Semestre – Tecnologia – Analise e Desenvolvimento de Sistemas Professor: Eduardo Silvestri Aluno:Clóvis de Oliveira- RA
Funções de datas Professor Esp. Diego André Sant’Ana Disciplina: Banco de Dados II professordiegosantana.wordpress.com.
SCC Bancos de Dados e Suas Aplicações
III – Oracle 9i Indexação. Índices Baseados em Funções É um índice baseado no valor de retorno de uma expressão ou função –A função pode ser um método.
Banco de Dados I I Comandos SQL
Comandos Alias, Joins, Funções e Índice Professor Esp. Diego André Sant’Ana Disciplina: Banco de Dados II professordiegosantana.wordpress.com.
Fundamentos de Banco de Dados Fundamentos de Banco de Dados Prof. Gale 2º. Semestre 2008.
CASE WHEN THEN ELSE END Professor Esp. Diego André Sant’Ana Disciplina: Banco de Dados II professordiegosantana.wordpress.com.
Equipe de monitoria Aula prática 4.  Tipos  Tabela de Objetos  Herança  Métodos  Referências  Coleções  Composição de coleções  Conectividade.
7P/SI – 2010/01 Prof. Carlos Alberto Seixas. Agenda Visão Geral sobre os Conceitos e Implementação sobre SGBs MySQL Revisão das Práticas Práticas 1 e.
Conceitos básicos Professor Esp. Diego André Sant’Ana
Daniel Paulo SQL Server 2014 Módulo II Daniel Paulo
VBA – Visual Basic para Aplicativos
Linguagem de definição de dados - SQL
BD SQL (Insert, Update, Delete) e Select Hayslan Nicolas Colicheski Bucarth – IFRO / 2015 –
Fundamentos de Banco de Dados Prof. André Cypriano M. Costa
Banco de Dados -Aprendendo conceitos -Usando o SQL Conf para:
Aula 13 - Triggers. Triggers no SGBD Postgres  Os Triggers (Gatilhos) são funções preparadas para serem disparadas no caso de alguma alteração ocorrer.
1 Programação de Banco de Dados José Antônio da Cunha George Azevedo da Silva.
Banco de Dados II Prof: Márcio Soussa Curso de Sistemas de Informação Faculdades Jorge Amado.
2/6/2016 José Antônio da Cunha - CEFET - RN1 Programação de Banco de Dados Funções.
Programação para Internet Aula 11 SQL (Introdução a linguagem, comandos de modificação: Create, Drop, Alter, Insert, Delete, Update)
Banco de Dados para Redes– Aula 03 Prof. Me. Ronnison Reges Vidal.
Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Capítulo 5 Mais SQL: Consultas Complexas, Triggers e Views.
BANCO DE DADOS Araújo Lima Out / 2017 Araújo.
PL/SQL Triggers e Procedures
Transcrição da apresentação:

Triggers (Gatilhos) Professor Esp. Diego André Sant’Ana E-mail: diego.santana@ifms.edu.br Disciplina: Banco de Dados II professordiegosantana.wordpress.com

Triggers Triggers são procedimentos armazenados que são acionados por algum evento e em determinado momento. Na maioria dos bancos de dados estes eventos podem ser inserções (INSERT), atualizações (UPDATE) e exclusões (DELETE), e os momentos podem ser dois: antes da execução do evento (BEFORE) ou depois (AFTER). E isso também vale para o PostgreSQL.

Triggers Um diferencial das triggers deste banco de dados para outros é que no PostgreSQL as triggers são sempre associadas a funções de triggers (veremos isso mais adiante) e, nos demais, criamos o corpo da trigger na própria declaração desta.

Tipos Triggers O PostgreSQL possui dois tipos de triggers: triggers-por-linha e triggers-por- instrução.

Tipos Triggers A trigger-por-linha é disparada uma vez para cada registro afetado pela instrução que disparou a trigger. Já a trigger-por- instrução é disparada somente uma vez quando a instrução é executada.

Tipos Triggers Funções de trigger e linguagens procedurais Funções de triggers são funções que não recebem nenhum parâmetro e retornam o tipo trigger. Essas funções recebem uma estrutura chamada TriggerData, e esta é passada internamente para a função pelo PostgreSQL.

Tipos Triggers O PostgreSQL disponibiliza duas variáveis importantes para serem usadas em conjunto com as triggers-por-linha: NEW e OLD. A variável NEW, no caso do INSERT, armazena o registro que está sendo inserido. No caso do UPDATE, armazena a nova versão do registro depois da atualização.

Tipos Triggers A variável OLD, no caso do DELETE, armazena o registro que está sendo excluído. No caso do UPDATE, armazena a antiga versão do registro depois da atualização.

Tipos Triggers As funções de triggers devem ser escritas em C (linguagem C) ou alguma linguagem procedural disponível no banco de dados. Essas liguagens podem ser várias, como Ruby, Perl, Python, entre outras. Atualmete existem quatro linguagens procedurais disponíveis na distribuição padrão do PostgreSQL: PL/pgSQL, PL/Tcl, PL/Perl e PL/Python. Mas é possível que o usuário defina outras linguagens. Para instalar novas linguagens no PostgreSQL, consulte a documentação oficial do PostgreSQL, que pode ser obtida no seguinte endereço: http://pgdocptbr.sourceforge.net/.

Tipos Triggers Cada linguagem, que suporta triggers, possui o seu próprio método para tornar os dados de entrada da trigger disponíveis para a função. Estes dados de entrada incluem o tipo de evento da trigger, assim como as opções informadas na criação da trigger. Para uma trigger no nível de linha, os dados de entrada também incluem as linhas NEW para as triggers de INSERT e UPDATE, e a linha OLD para os triggers de UPDATE e DELETE.

Exemplo de triggers CREATE TRIGGER nome { BEFORE | AFTER } { evento [ OR ... ] } ON tabela [ FOR [ EACH ] { ROW | STATEMENT } ] EXECUTE PROCEDURE nome_da_função ( argumentos )

Exemplo de triggers Argumentos: nome é o nome da trigger. before | after determina se a função será chamada antes ou depois do evento. evento indica em que momento a trigger será disparada. A trigger pode ser dispara antes ou depois de um evento de DELETE, UPDATE ou INSERT. tabela indica em qual tabela a trigger estará associada. row | statement especifica se a trigger deve ser disparada uma vez para cada linha afetada pelo evento ou apenas uma vez por comando SQL. Se não for especificado nenhum dos dois, o padrão é FOR EACH STATEMENT. nome_da_função especifica a função de trigger.

Exemplo de triggers Um exemplo de criação de uma trigger é apresentado abaixo: CREATE TRIGGER "u_tg_validaCpf " BEFORE INSERT ON CLIENTE FOR EACH ROW EXECUTE PROCEDURE u_fn_validaCpf();

Alter trigger Alterando uma trigger A sintaxe do comando para alterar uma trigger é apresentada abaixo: ALTER TRIGGER nome ON tabela RENAME TO novo_nome Argumentos: nome é nome do gatilho existente a ser alterado. tabela é o nome da tabela onde o gatilho atua. novo_nome é o novo nome do gatilho.

Excluir trigger Excluindo uma trigger Para excluir uma trigger basta executar o comando abaixo: DROP TRIGGER nome ON tabela [ CASCADE | RESTRICT ] Argumentos: nome é o nome do gatilho a ser removido. tabela é o nome da tabela para a qual o gatilho está definido. [ CASCADE | RESTRICT ] indica se ao remover a trigger vamos remover também todos os objetos que dependem dela (CASCADE) ou recusaremos sua exclusão (RESTRICT).

Desabilitar trigger Para desabilitar uma trigger execute o comando abaixo: ALTER TABLE nome_tabela DISABLE TRIGGER nome_trigger Para desabilitar todas as triggers da tabela, execute o seguinte comando: ALTER TABLE nome_tabela DISABLE TRIGGER ALL

Desabilitar as trigger Para desabilitar uma trigger execute o comando abaixo: ALTER TABLE nome_tabela DISABLE TRIGGER nome_trigger Para desabilitar todas as triggers da tabela, execute o seguinte comando: ALTER TABLE nome_tabela DISABLE TRIGGER ALL

Crie uma tabela CREATE TABLE trig.empresa ( nome_empresa text, salario integer, ultima_data timestamp, ultimo_usuario text );

Função de checagem CREATE FUNCTION trig.empresa_check() RETURNS trigger AS $$ BEGIN -- Checar o nome da empresa e o salario IF NEW.nome_empresa IS NULL THEN RAISE EXCEPTION 'nome da empresa nao pode ser nulo '; END IF; IF NEW.salario IS NULL THEN RAISE EXCEPTION '% não poder ter salario nulo ', NEW.nome_empresa ; -- Checar se é negativo IF NEW.salario < 0 THEN RAISE EXCEPTION '% salario não pode ser negativo', NEW.nome_empresa; -- Coloca os usuario e a data da alteração NEW.ultima_data := current_timestamp; NEW.ultimo_usuario := current_user; RETURN NEW; END; $$ LANGUAGE plpgsql;

Cria uma trigger CREATE TRIGGER empresa_check BEFORE INSERT OR UPDATE ON trig.empresa FOR EACH ROW EXECUTE PROCEDURE trig.empresa_check();

INSERT na tabela com trigger insert into trig.empresa (nome_empresa,salario) values(null,null) insert into trig.empresa (nome_empresa,salario) values('IFMS',null) insert into trig.empresa (nome_empresa,salario) values('IFMS',-200) insert into trig.empresa (nome_empresa,salario) values('IFMS',200) update trig.empresa set salario=2000 select * from trig.empresa

Outro exemplo CREATE TABLE trig.emp ( nome_empresa text NOT NULL, salario integer ); CREATE TABLE trig.emp_audit( operacao char(1) NOT NULL, data_alt timestamp NOT NULL, user_id text NOT NULL, nome_empresa text NOT NULL, salario integer

Criar uma função que retorna uma trigger CREATE OR REPLACE FUNCTION trig.auditar_empresa() RETURNS TRIGGER AS $emp_audit$ BEGIN -- -- Cria uma linha em emp_audit para refletir a operação em emp e fazer usando a variavel -- TG_OP para trabalhar a operacao IF (TG_OP = 'DELETE') THEN INSERT INTO trig.emp_audit(operacao,data_alt,user_id ,nome_empresa,salario ) Values( 'D', now(), user, OLD.nome_empresa,OLD.salario); RETURN OLD; ELSIF (TG_OP = 'UPDATE') THEN INSERT INTO trig.emp_audit SELECT 'U', now(), user, NEW.*; RETURN NEW; ELSIF (TG_OP = 'INSERT') THEN INSERT INTO trig.emp_audit SELECT 'I', now(), user, NEW.*; END IF; RETURN NULL; -- resultado e idnorado desde que o depois da trigger END; $emp_audit$ LANGUAGE plpgsql;

Criando a trigger CREATE TRIGGER emp_audit AFTER INSERT OR UPDATE OR DELETE ON trig.emp FOR EACH ROW EXECUTE PROCEDURE trig.auditar_empresa();

Criando a trigger INSERT INTO TRIG.EMP VALUES('ifms',2000) update trig.emp set salario=5000 where nome_empresa='ifms' delete from trig.emp where nome_empresa='ifms' select * from trig.emp select * from trig.emp_audit();

REFERÊNCIAS http://imasters.com.br/artigo/10644/postgre sql/triggers-no-postgresql/ http://www.postgresql.org/docs/9.2/static/pl pgsql-trigger.html http://pt.wikibooks.org/wiki/PostgreSQL_Pr %C3%A1tico/Fun%C3%A7%C3%B5es_Defi nidas_pelo_Usu%C3%A1rio_e_Triggers/Tri ggers