Você está na página 1de 6

SQL Avanada

Ludne Mota, 16 de maro de 2012

Views
Views ou simplesmente, Vises em banco de dados so tabelas virtuais criadas a partir de uma ou mais tabelas fsicas de um banco de dados. Ela permite fazer consultas aos dados de maneira virtual, isto , fazer consultas sem que sejam realmente nas tabelas fsicas, isso ajuda na segurana de informaes. Por exemplo: Podemos criar uma tabela que ser usada para as consultas que sero feitas pelos alunos, desta maneira, podemos atribuir essa nova viso apenas os campos que lhe interessam como nome e sua mdia de uma disciplina. Isto aumenta a segurana, pois no ter como por algum mtodo hacker obter os outros dados como a mdia de outros alunos, porque esto na tabela fsica. Um uso que tambm podemos fazer com vises, acontece quando precisamos de alguns dados restritos numa tabela separada. Fazemos isto criando uma viso, ou mais se necessrio, sem precisar duplicar os dados de uma tabela em outra no mesmo banco de dados. A sintaxe bsica de uma viso a seguinte: CREATE VIEW nome_da_visao AS SELECT t1.campo1, t2.campo2 FROM tabela1 t1, tabela2 WHERE t1.campo1<>12 AND t2.campo1 LIKE nome%;

bom usarmos vises apenas quando se tratar de consultas, pois se pensarmos em fazer inseres, alteraes ou excluses podem tornar uma viso muito complexa. Em geral, uma viso suporta os mesmos comandos de uma tabela, afinal, vises tambm so tabelas, s que, virtuais.

Stored Procedure
Stored Procedure, ou procedimento armazenado uma coleo de comandos SQL que encapsula comandos para cham-los como se fosse um comando s. como de escrever um programa dentro do prprio servidor para ser executado dentro do prprio servidor. Serve para resolver tarefa que so executados com alta frequncia. Tal caso, sem Stored Procedures, essas tarefas quando executadas demasiadamente no servidor de banco de dados lhe faz estar sobrecarregado ocasionando perda de desempenho. Por isso, o uso de Stored Procedure prov a melhora de performance, alm de criar mecanismos de segurana na aplicao, etc. O objetivo da criao do Stored Procedure foi o equilbrio da carga entre o servidor de aplicao e o servidor de bando de dados, ou seja, equilibrar a balana a qual os respectivos servidores so os pesos. Ento, vamos iniciar a criao de um Stored Procedure... Sua sintaxe base : CREATE PROCEDURE nome() BEGIN comandos... END;

Por exemplo, podemos fazer o seguinte Stored Procedure: CREATE PROCEDURE todos_professores() BEGIN SELECT * FROM professor; END;

Para execut-lo basta cham-lo pelo nome que demos a ele: CALL todos_professores(); Importante: Quando voc usa END; para fechar o corpo do procedimento antes dele vem algum comando tambm terminado com ; reconhecendo como se ali fosse o final do procedimento. Por isso, antes de criamos nossa Stored Procedure vamos mudar o delimitador SQL padro para //. O comando para mudar o seguinte: DELIMITER //

Se tiver apenas um comando dentro do Stored Procedure no necessrio usar os delimitadores do corpo BEGIN e END. Como dito no comeo desse artigo, Stored Procedure como se fosse um programa, ento, ele deve ter nenhum, um ou mais parmetros. Veja como se cria um com parmetro: CREATE PROCEDURE nome(variavel int) BEGIN SELECT * FROM professor WHERE idprofessor=variavel; END// At aqui fizemos um simples Stored Procedure. Vamos torn-lo mais prximo a um programa criando varives e estruturas de controle como IF ELSE, WHILE. CREATE PROCEDURE nome(variavel int) BEGIN DECLARE var INT; SET var = variavel; IF(var > 0) THEN SELECT * FROM professor WHERE idprofessor=variavel; ELSE SELECT 0; END IF; END// Agora com WHILE: CREATE PROCEDURE incrementa(parametro int) BEGIN WHILE paramentro >= 0 DO INSERT INTO outratabela(valor) VALUES(parametro); SET parametro = parametro + 1; END WHILE; END//

Agora chamamos a rotina: CALL incrementa(1);

Trigger
Trigger, ou Gatilho, um recurso usado em banco de dados SQL que visa execuo de determinados procedimentos que so executados automaticamente quando disparado algum evento em uma tabela ou uma view. Um problema: quando temos o contedo de uma tabela alterado, nesta alterao outros dados de outras tabelas podem estar relacionados e, consequentemente, alguns dados podem ficar sem nexo por isto. Para resolver este gargalo dentro do banco de dados usamos triggers. Soluo: usamos uma trigger para que quando esta tabela for alterada possamos tomar alguma providncia em relao outra tabela. Triggers, por exemplo, podem ser usadas para gerar dados em uma tabela de histricos do prprio bando de dados. Outros exemplos que podemos citar do benefcio so os seguinte: Executar regras de negcio (exemplo: notificar um gerente de estoque quando o estoque de produtos estiver baixo); Replicar dados (exemplo: replicar dados em outro banco de dados como forma de monitoramento); Garantir desempenho (exemplo: atualizar o saldo de uma conta-corrente aps uma transao, para consultas rpidas ao saldo). Existem trs tipos de trigger que podemos criar: 1. Para insero de dados: INSERT; 2. Para excluso de dados: DELETE; 3. Para atualizao de dados: UPDATE; Sua sintaxe bsica :
CREATE TRIGGER nome TIME EVENT ON tabela FOR EACH ROW instrucoes;

E para exclu-la:
DROP TRIGGER nome;

Agora vamos criar um trigger bsico:

CREATE TRIGGER tg_cliente_cadastrar AFTER INSERT ON cliente FOR EACH ROW INSERT INTO auxiliar SET telefone = NEW.contato;

O NEW.nome o campo nome da tabela cliente que ser o novo dados inserido em todos registros da tabela auxiliar. Pode ser NEW ou OLD; O TIME pode ser: AFTER ou BEFORE.
IMPORTANTE: No pode haver duas trigger numa dada tabela que tenha a mesma ao e evento. Por exemplo, voc no pode ter dois BEFORE UPDATE para uma tabela. Mas voc pode ter um BEFORE UPDATE e um BEFORE INSERT, ou um BEFORE UPDATE e um AFTER UPDATE.

Nota: Atualmente, aes de chaves estrangeiras no ativam triggers. O EVENT pode ser: INSERT, DELETE ou UPDATE. Se voc for usar mais instrues, por exemplo, INSERT, UPDATE e DELETE, voc precisa delimitar o corpo das instrues com BEGIN e AND. E, ainda, delimitar a instruo SQL com outro delimitador que voc mesmo especificar ao contrrio do padro que ;. Por exemplo:
DELIMITER // CREATE TRIGGER teste_trigger AFTER INSERT ON tabela1 FOR EACH ROW BEGIN INSERT INTO tabela2 SET campo1 = NEW.campo2; DELETE FROM tabela3 WHERE campo3 = NEW.campo1; UPDATE tabela4 SET campoA = campoB + 1 WHERE campo4 = NEW.campo1; END;

Importante: Quando voc usa END; para fechar o corpo do procedimento antes dele vem algum comando tambm terminado com ; reconhecendo como se ali fosse o final do procedimento. Por isso, antes de criamos nossa Stored Procedure vamos mudar o delimitador SQL padro para //. O comando para mudar o seguinte: DELIMITER //