Vous êtes sur la page 1sur 54

Banco de Dados II

Vises, Stored Procedures e Triggers

Views
(Vises)

Vises - Views
Em um sistema relacional a viso uma relao virtual, definida como o resultado de uma consulta sobre relaes bsicas (ou reais) - mas no materializada como uma relao real. Viso lgica de tabelas; Aumenta o nvel de segurana; Sumarizar dados de diversas tabelas; As VIEWs obedecem as mesmas regras das tabelas que as originaram; Armazenamento Fsico x Processamento (Custo x Benefcio)

Vises - Views
Tabela virtual definida atravs de uma consulta;
No h um espao em disco no qual seus registros esto armazenados;

Definio fica armazenada no catlogo


A consulta SQL previamente gravada no banco e nomeada;

Abstrao

Vises - Views
Vises lgicas (alto nvel) da informao; Facilita a documentao do BD; Permite segurana de acesso sensvel aos dados; Permite alteraes no nvel conceitual sem impacto nas aplicaes clientes; Pode ser usada em consulta; Insero, atualizao e remoo com restries; Embora seja possvel usar uma viso para modificao, h algumas restries:
De modo geral, se a viso for baseada em uma nica tabela, as atualizaes so possveis; Mas se houver uma juno, agrupamento ou perda do atributo chave, muito provavelmente no ser permitida a atualizao.

Vises - Views
Sintaxe:
Criao: CREATE VIEW <nome> [(<atributos da view>)] AS <query> Excluso: DROP VIEW nome_viso;

Vises - Exemplo

Vises - Exemplo
Relao: Produto (Cod_prod, Nome, UnidMed, Preco) CREATE VIEW Produtos_Caros (Cod_prod, Nome) AS SELECT Cod_prod, Nome FROM Produtos WHERE preco >= 5000

Vises - Exemplo
Relao: Func (Matr, Nome, endereco, Cargo, Salario, MatrGerente) CREATE VIEW Mesmo_Cargo AS SELECT * FROM Func f1 WHERE f1.cargo = gerente; CREATE VIEW Consultar_salario (Matr, Nome, Salario) AS SELECT Matr, Nome, Salario FROM Func;

Vises - Exemplo
Relao: Func (Matr, Nome, endereco, Cargo, Salario, MatrGerente) Verificar o nome e o salrio dos funcionrios, os quais so subordinados ao gerente 3020. CREATE VIEW Consultar_salario (Nome, Salario) AS SELECT Nome, Salario FROM Func WHERE MatrGerente = 3020;

Stored Procedures
(Procedimentos Armazenados)

Stored Prodecure (sp)


Permite programao modular
Encapsulam conjuntos de operaes sobre dados Permite que aplicaes acessem o BD de maneira uniforme Invocada por qualquer aplicao que acessa o BD

Traduzido e otimizado para acesso a dados uma nica vez pelo SGBD Podem ter atributos de segurana
Usurios podem ter permisses de executar stored procedures sem ter permisses sobre os objetos referenciados dentro da procedure

Pode reduzir o trfego na rede

13

Stored Prodecure (sp)


So semelhantes a procedimentos e subrotinas em outras linguagens:
Podem ser chamadas por outra sp ou por aplicativos desenvolvidos em PHP, ASP, Delphi, VB, etc Podem receber e retornar parmetros Podem conter instrues de controle e laos

Uma stored procedure (sp) uma coleo de comandos nomeada que salva no BD.

Stored Prodecure (sp)


Uma vez criada, uma sp pode ser executada sempre que necessrio, simplesmente chamando a sp. Vantagens de utilizar sp:
Facilitar a manuteno e a alterao das aplicaes Ocultar a complexidade de acesso ao BD Poder receber parmetros de entrada e retornar resultados Reduzir o trfego de rede gerado pela aplicao Facilitar e centralizar o gerenciamento de permisses Melhorar a velocidade de execuo

Stored Procedures sem parmetros

CREATE PROCEDURE Relatorio_Vendas_Brutas AS SELECT P.NmeroDoPedido, sum(PreoUnitrio * Quantidade) as Total_Bruto FROM Pedidos P, DetalhesPedido D WHERE P.NmeroDoPedido = D.NmeroDoPedido GROUP BY P.NmeroDoPedido;

exec Relatorio_Vendas_Brutas

16

Stored Procedures com parmetros de entrada


CREATE PROCEDURE Endereco_Empregado @SobreNome nvarchar(20), @Nome nvarchar(10) AS SELECT Endereo, Cidade, CEP FROM Funcionarios F WHERE Nome = @Nome and Sobrenome = @SobreNome

exec Endereco_Empregado 'Buchanan','Steven'

17

Stored Procedures Com parmetros de entrada (mysql)


CREATE PROCEDURE minha_sp ( IN Cod int, IN Nome varchar(50), IN Tel varchar(15) )

BEGIN INSERT INTO empregados VALUES (Cod,Nome,Tel); END;

18

Stored Procedures Com parmetros de entrada e sada


CREATE PROCEDURE NomeCliente_do_Pedido @NmeroDoPedido int, @NomeDaEmpresa nvarchar(40) OUTPUT AS SET @NomeDaEmpresa = (SELECT NomeDaEmpresa FROM Pedidos P, Clientes C WHERE P.CdigoDoCliente = C.CdigoDoCliente AND P.NmeroDoPedido = @NmeroDoPedido);

DECLARE @NomeCliente nvarchar(40) exec NomeCliente_do_Pedido 10248, @NomeCliente OUTPUT print @NomeCliente

19

Stored Procedures com parmetros de sada (mysql)


CREATE PROCEDURE NomeCliente_do_Pedido (NumPed int, OUT Nome nvarchar(40)) AS SELECT NomeDaEmpresa INTO Nome FROM Pedidos P, Clientes C WHERE P.CdigoDoCliente = C.CdigoDoCliente AND P.NmeroDoPedido = NumPed);

DECLARE @NomeCliente varchar(40); CALL NomeCliente_do_Pedido (10248, @NomeCliente ); SELECT @NomeCliente;

Obs.: parmetros do tipo INOUT

20

Problemas com o uso de Stored Procedures


Falta de padronizao entre SGBDs, o que acarreta na dificuldade de portabilidade do cdigo; Existem SGBDs que ainda no disponibilizam esta funcionalidade, inviabilizando a distribuio do processamento entre a aplicao e o SGBD.

Triggers
(Gatilhos)

O que Trigger?
Procedimento disparado automaticamente pelo SGBD em resposta a um evento especfico do banco de dados; Semelhante a um procedimento armazenado (Stored Procedure) mas tem a sua execuo disparada pelo SGBD quando ocorre um evento preestabelecido; O evento associado tentativa de execuo de operaes sobre uma tabela (incluso, excluso e alterao);

Trigger - Requisitos
Especificar quando o trigger deve ser executado;
Isso desmembrado em um evento que faz com que o trigger seja verificado e uma condio que precisa ser satisfeita para que a execuo do trigger prossiga.

Especificar as aes a serem tomadas quando o trigger executar. Regras ECA


Evento Condio Ao

Armazenamento
Os triggers so armazenados como se fossem dados normais, o que os torna persistentes e acessveis para todas as operaes no banco de dados; Uma vez que um trigger armazenado, o SGBD assume a responsabilidade de execut-lo quando o evento especificado ocorre e a condio correspondente satisfeita.

Pra que serve?


Preenchimento de campo resultante de uma expresso; Crtica aos dados com mensagens mais adequadas s regras do negcio; Acessos que alterem linhas de uma tabela ou eventos que ocorram no BD podem ser registrados em outra tabela (auditoria); assegurar as restries de integridade melhorar a segurana no acesso aos dados melhorar o desempenho das aplicaes reduzir o volume de dados trafegados na rede melhorar a manuteno do software.

Exemplo - Banco
Supondo que um cliente de um banco faa uma retirada de dinheiro maior do que o seu saldo, o BD age da seguinte forma:
Seta para zero o saldo do cliente; Cria um emprstimo no valor da dvida para o cliente;

Exemplo - Estoque
Um depsito deseja manter um estoque mnimo de cada item.
Quando o estoque deste item fica menor do que o nvel mnimo estipulado, um pedido deve ser adicionado automaticamente lista de pedidos.

Triggers em SQL
Passaram a ser padro SQL em 1999; Cada SGBD utiliza sua prpria linguagem e sintaxe para triggers; Ativao da Triggers:
Antes ou depois de algum evento de adio (insert), atualizao (update) e remoo (delete)

Utilizada para verificao dos dados antes ou depois da realizao do evento;

Triggers em SQL
Sintaxe (Postgre)

Sintaxe (Oracle)
CREATE OR REPLACE TRIGGER nome_trigger [BEFORE | AFTER | INSTEAD OF] [INSERT OR DELETE OR UPDATE] [OF coluna] ON [ tabela | DATABASE | SCHEMA ] WHEN condio [FOR EACH ROW] Bloco PL/SQL

Trigger Exemplo (Postgre)


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 exemplo anterior 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 );

Tipos de Trigger

Eventos e Variveis de Contexto


possvel combinar alguns dos modos, desde que tenham a operao de AFTER ou BEFORE em comum.

Variveis de ambiente
Quando um trigger afeta vrias linhas, podemos, consultar ou modificar os valores antigos e novos dos campos da linha sendo alterada, atravs das variveis de ambiente: :old representa a linha corrente prvia

:new representa a linha aps a alterao

Tipos de Trigger

* Alterar os valores das variveis nesses eventos no causar qualquer efeito prtico.

Exemplo (Oracle)
create or replace trigger t_aft_upd_row_AumentaPrecos after update on cursos for each row begin if :new.preco > 1200 then raise_application_error(-20500, 'Tentativa exagerada de aumento!'); end if; end; /

Exemplo (Oracle)
create or replace trigger t_aft_upd_row_AumentaPrecos Possvel Execuo: after update SQL> update cursos set preco=preco*2; on cursos update row for each cursos set preco=preco*2 begin * if :new.preco > 1200 then ERROR at line 1: raise_application_error(-20500, 'Tentativa exagerada ORA-20500: Tentativa exagerada de aumento! de aumento!'); ORA-06512: at end if; LOUZADA.T_AFT_UPD_ROW_AUMENTAPRECOS", end; line 3 /

ORA-04088: error during execution of trigger LOUZADA.T_AFT_UPD_ROW_AUMENTAPRECOS'

Exemplo (Oracle) - Insert


Criando a Sequncia create sequence gera_matr_aluno start with 40 increment by 1 maxvalue 1000 nocycle; Agora o trigger create or replace trigger t_bef_ins_row_InsereAluno before insert on alunos for each row declare nova_matricula begin number;

select Gera_Matr_aluno.Nextval into nova_matricula from dual; :new.matricula := nova_matricula; end; /

Exemplo (Oracle) - Insert


Exemplo de disparo da trigger: create sequence gera_matr_aluno
start with 40 increment by 1 maxvalue 1000 nocycle; Insert into alunos (nome_aluno) values (Chico Xavier); Agora o trigger create or replace trigger t_bef_ins_row_InsereAluno before insert on alunos for each row declare nova_matricula begin number; Criando a Sequncia

select Gera_Matr_aluno.Nextval into nova_matricula from dual; :new.matricula := nova_matricula; end; /

Exemplo (Oracle) - Update


create or replace trigger t_bef_upd_stm_Registro before update on cursos Begin update Tab_Auditoria set atualizacoes = atualizacoes + 1; end; /

Exemplo (Oracle) - Update


Exemplo de disparo da trigger: create or replace trigger t_bef_upd_stm_Registro before update on cursos Update cursos set preco=100; Begin update Tab_Auditoria Comprovando: set atualizacoes = atualizacoes + 1; end; Select * from tab_auditoria; / Obs.: a tabela tab_auditoria j deve existir!

Exemplo (Oracle) - Delete


create or replace trigger t_bef_del_row_LimpaHist before delete on turmas for each row begin delete historico where cod_turma = :old.cod_turma; end; /

Exemplo (Oracle) - Delete


create or replace trigger t_bef_del_row_LimpaHist Antes de disparar o trigger: before delete Alter table historico disable constraint on turmas historico_turma_fk; for each row begin Exemplo de disparo da trigger: delete historico Delete turmas; where cod_turma = :old.cod_turma; end; Comprovando: /

Select * from turmas; Select * from historico; Obs.: d um rollback para restabelecer os valores!

Exemplo (Oracle) Mltiplos Eventos


create or replace trigger t_bef_updIns_stm_MultHist before insert or update on historico declare v_hoje number; v_agora number; begin v_hoje := to_number(to_char(sysdate,'dd')); v_agora := to_number(to_char(sysdate,'hh24mi')); if inserting then if v_agora > 1830 then raise_application_error(-20600, 'Hora proibida para inseres'); end if; else if v_hoje = 1 then raise_application_error(-20700, 'Dia proibido para atualizaes'); end if; end if; end;/

Exemplo (Oracle) Mltiplos Eventos


create or replace trigger t_bef_updIns_stm_MultHist

Exemploinsert or updatetrigger: before de disparo da


on historico declare v_hoje number; begin v_hoje := to_number(to_char(sysdate,'dd')); v_agora := to_number(to_char(sysdate,'hh24mi')); if inserting then if v_agora > 1830 then raise_application_error(-20600, 'Hora proibida para inseres'); end if; else if v_hoje = 1 then raise_application_error(-20700, 'Dia proibido para atualizaes'); end if; end if; end;/

Insert into historico values (12,12,10); //em horrio imprprio Update historico set nota = 10; v_agora number;

Exemplos (Interbase)
Exemplo de regra que no permite a remoo de um CLIENTE que possua CONTRATO

CREATE TRIGGER T_Cliente FOR cliente AFTER delete AS DECLARE num_linhas integer; begin select count(*) into num_linhas from CONTRATO where CONTRATO.cod_cliente = old.cod_cliente; if (num_linhas > 0) then rollback; end;

Exemplos (Interbase)
Regra que no permite a atualizao do Cod_Cliente se o CLIENTE possui CONTRATO

CREATE TRIGGER T_Cliente_codigo FOR cliente AFTER update


AS

DECLARE num_lin integer; begin if :old.cod_cliente <> :new.cod_cliente then select count(*) into num_lin from CONTRATO where CONTRATO.cod_cliente = old.cod_cliente; if (num_lin > 0) then rollback; end if; end if; end;

Exemplos (Interbase)
Regra remove todos os CONTRATO associados a um CLIENTE que est sendo excludo. CREATE TRIGGER T_cliente FOR cliente AFTER delete AS begin DELETE from CONTRATO where CONTRATO.cod_cliente = :old.cod_cliente; end;

Exemplos (Interbase)
Cria cdigo automtico para a tabela cliente utilizando o generetor do banco Interbase CREATE TRIGGER T_ChavePrim FOR cliente BEFORE insert AS BEGIN NEW.cod_cli = GEN_ID(Cliente_GEN, 1); END

Quando no usar Triggers?


Manter dados de resumo (summary data);
Ex.: Excluso de uma tupla da tabela:
Empregado(salario, dept); Utilizar triggers para atualizar o salrio total de todo o departamento;

Para fazer isso usa-se vises materializadas (materialized views);

Quando no usar Triggers?


Replicao de base de dados;
Quando alguma modificao feita na base de dados principal, um trigger aplica a mesma modificao na cpia;

Quando no usar Triggers?


Triggers devem ser utilizados com cuidado;
Erros na execuo do trigger podem causar a falha nas funes de incluir/ deletar/ atualizar da funo que o disparou; Um trigger pode disparar outro trigger;
No pior caso ocorre uma cadeia infinita de triggers; Ex.: A insero em uma relao dispara um trigger que insere uma nova tupla na mesma tabela;

Triggers X Procedures
Trigger
Ativado implicitamente Execuo disparada pelo SGBD quando as condies forem satisfeitas Aplicao no conhece os triggers Proibidos: commit, rollback ou savepoint Quem ativa no precisa possuir privilgio de execuo No se pode emitir um comando select into em tabelas afetadas pelo Trigger.

Procedure ou Function
Ativado explicitamente

Execuo disparada pela aplicao

Aplicao conhece as SPs Esses comandos so permitidos Quem ativa precisa possuir privilgio de execuo

Restrio no se aplica

Vous aimerez peut-être aussi