8
ITB - Instituto Técnico de Barueri Brasílio Flores de Azevedo Leandro Angelo Alberti – 1º Semestre 2009 - LECO Pág. 1 Views As views nada mais são do que instruções SELECT já pré-definidas e armazenadas no banco. Este conceito pode parecer simples, e é, mas pode-se resolver muitos problemas com as views. Para criar uma view, utilizamos o comando CREATE VIEW. Sua sintaxe: CREATE VIEW <view_name> AS <instrução_SELECT> Exemplo: CREATE VIEW V_TAB1 AS SELECT COD , NOME FROM TABELA1 No exemplo acima, criamos uma view que somente retorna dois campos da tabela base (no caso a TABELA1) COD e NOME. Podemos então utilizar a view como se fosse uma tabela normal: SELECT COD FROM V_TAB1 WHERE NOME = ‘Mauro’ Detalhe: no exemplo acima só poderíamos utilizar os dois campos da view, COD e NOME. Mesmo que a tabela base (TABELA1) possua mais campos não poderíamos nos referir a eles, pois eles não constam na definição da view. Aí alguém poderia pensar: “Fácil, coloco um SELECT * FROM TABELA1 na definição da view”. Esta prática, além de não ser recomendada por motivos de performance, pode gerar um problema: vamos supor que futuramente alguém inclua um campo na tabela base (TABELA1). Mesmo com o * na definição da view o novo campo NÃO é retornado. É necessário apagar a view e criá-la de novo. É importante também lembrar que todos os campos (calculados ou não) referenciados na view devem possuir um nome, que deve ser único na definição da view. Outro ponto importante sobre as views: não podemos utilizar a cláusula ORDER BY na definição da view. Como uma exceção: quando se utiliza TOP para limitar os registros: -- Isto é uma definição válida de uma view CREATE VIEW V_TAB1 AS SELECT TOP 100 COD , NOME FROM TABELA1 ORDER BY NOME Também não podemos utilizar as cláusulas COMPUTE, COMPUTE BY e INTO dentro de uma view. Uma view também pode ser utilizada para incluir dados. Não entendeu? Vamos lá. Supondo que a TABELA1, utilizada na criação da view V_TAB1, possua somente os dois campos utilizados na view , COD e NOME. Podemos fazer um instrução INSERT normalmente, como se fosse somente uma tabela: INSERT INTO V_TAB1 VALUES(1,’VANESSA’) Isso nos possibilita fazer uma inserção em um view . Como é só uma view, podemos fazer uma instrução INSERT na view que colocará valores somente em alguns campos da tabela. Quando utilizarem esta prática, tomem cuidado com campos calculados e expressões de agregação feitos na definição da view.

Views - Procedures - Triggers

Embed Size (px)

Citation preview

Page 1: Views - Procedures - Triggers

ITB - Instituto Técnico de Barueri Brasílio Flores de Azevedo Leandro Angelo Alberti – 1º Semestre 2009 - LECO

Pág. 1

Views

As views nada mais são do que instruções SELECT já pré-definidas e armazenadas no banco. Este conceito pode parecer simples, e é, mas pode-se resolver muitos problemas com as views. Para criar uma view, utilizamos o comando CREATE VIEW. Sua sintaxe: CREATE VIEW <view_name> AS <instrução_SELECT>

Exemplo:

CREATE VIEW V_TAB1 AS SELECT COD , NOME FROM TABELA1

No exemplo acima, criamos uma view que somente retorna dois campos da tabela base (no caso a TABELA1) COD e NOME. Podemos então utilizar a view como se fosse uma tabela normal: SELECT COD FROM V_TAB1 WHERE NOME = ‘Mauro’

Detalhe: no exemplo acima só poderíamos utilizar os dois campos da view, COD e NOME. Mesmo que a tabela base (TABELA1) possua mais campos não poderíamos nos referir a eles, pois eles não constam na definição da view.

Aí alguém poderia pensar: “Fácil, coloco um SELECT * FROM TABELA1 na definição da view”. Esta prática, além de não ser recomendada por motivos de performance, pode gerar um problema: vamos supor que futuramente alguém inclua um campo na tabela base (TABELA1). Mesmo com o * na definição da view o novo campo NÃO é retornado. É necessário apagar a view e criá-la de novo. É importante também lembrar que todos os campos (calculados ou não) referenciados na view devem possuir um nome, que deve ser único na definição da view.

Outro ponto importante sobre as views: não podemos utilizar a cláusula ORDER BY na definição da view. Como uma exceção: quando se utiliza TOP para limitar os registros: -- Isto é uma definição válida de uma view CREATE VIEW V_TAB1 AS SELECT TOP 100 COD , NOME FROM TABELA1 ORDER BY NOME

Também não podemos utilizar as cláusulas COMPUTE, COMPUTE BY e INTO dentro de uma view. Uma view também pode ser utilizada para incluir dados. Não entendeu? Vamos lá.

Supondo que a TABELA1, utilizada na criação da view V_TAB1, possua somente os dois campos utilizados na view , COD e NOME. Podemos fazer um instrução INSERT normalmente, como se fosse somente uma tabela: INSERT INTO V_TAB1 VALUES(1,’VANESSA’)

Isso nos possibilita fazer uma inserção em um view . Como é só uma view, podemos fazer uma instrução INSERT na view que colocará valores somente em alguns campos da tabela. Quando utilizarem esta prática, tomem cuidado com campos calculados e expressões de agregação feitos na definição da view.

Page 2: Views - Procedures - Triggers

ITB - Instituto Técnico de Barueri Brasílio Flores de Azevedo Leandro Angelo Alberti – 1º Semestre 2009 - LECO

Pág. 2

As views também podem se referenciar a outras tabelas de outros banco de dados de outros servidores SQL Server, ou mesmo de um arquivo do Access ou até uma tabela do Oracle. A estas views damos o nome de particioned views e possuem algumas características especiais.

A partir do SQL Server 2000 também podemos criar um índice para a view, chamada de indexed view, que melhoram significativamente a performance.

As views também são uma importante ferramenta para simplificar suas instruções SELECT: ao invés de várias subquery’s, podemos encapsular toda um lógica dentro de uma view, tornando assim o código final da instrução bem mais legível.

Por último, as views podem ser utilizadas para evitar o acesso direto à tabela. Por exemplo: o usuário X não pode ver o campo SALARIO da tabela FUNCIONARIO. Como fazer isto? Crie uma view sem incluir este campo e dê permissão de consulta à view ao usuário X sem liberar o acesso físico à tabela, ocultando assim o campo SALARIO.

EXEMPLOS:

Exemplo 1 - Crie uma View chamada V_CliSemFone que mostra os dados dos clientes que não tem telefone. CREATE VIEW V_CliSemFone AS SELECT * FROM CLIENTE WHERE COD_CLI NOT IN(SELECT COD_CLI FROM FONE) ------------------------------------------------------------- SELECT * FROM V_CliSemFone ------------------------------------------------------------- Exemplo 2 - Crie uma View chamada V_CliSolteiro que mostre todos os clientes solteiros. CREATE VIEW V_CliSolteiro AS SELECT * FROM CLIENTE WHERE COD_CLI NOT IN(SELECT COD_CLI FROM CONJUGE) ------------------------------------------------------------- SELECT * FROM V_CliSolteiro ------------------------------------------------------------- Exemplo 3 - Crie uma View chamada V_CliPedFunc que mostra o Codigo e nome dos cliente, o codigo e nome dos funcionários, o numero, a data e o valor todal dos pedidos. CREATE VIEW V_CliPedFunc AS SELECT CLIENTE.COD_CLI,CLIENTE.NOME_CLI, FUNCIONARIO.COD_FUNC,FUNCIONARIO.NOME_FUNC, PEDIDO.NUM_PED,DATA_PED,VAL_PED FROM FUNCIONARIO INNER JOIN PEDIDO ON FUNCIONARIO.COD_FUNC = PEDIDO.COD_FUNC INNER JOIN CLIENTE ON CLIENTE.COD_CLI = PEDIDO.COD_CLI INNER JOIN ITENS ON ITENS.NUM_PED = PEDIDO.NUM_PED INNER JOIN PRODUTO ON PRODUTO.COD_PROD = ITENS.COD_PROD ------------------------------------------------------------- SELECT * FROM V_CliPedFunc -------------------------------------------------------------

Ref.: http://imasters.uol.com.br/artigo/239/sql_server/usando_views/ e Apostila SQL Impacta Mód. 2.

Page 3: Views - Procedures - Triggers

ITB - Instituto Técnico de Barueri Brasílio Flores de Azevedo Leandro Angelo Alberti – 1º Semestre 2009 - LECO

Pág. 3

Stored Procedures

Stored Procedure, traduzido Procedimento armazenado, é uma biblioteca de comandos em SQL para utilização junto ao banco de dados.

Ela armazena tarefas repetitivas e aceita parâmetros de entrada para que a tarefa seja efetuada de acordo com a necessidade individual.

Uma Stored Procedure pode reduzir o tráfego na rede, melhorar a performance de um banco de dados, criar tarefas agendadas, diminuir riscos, criar rotinas de processsamento, etc.

Por todas estas e outras funcionalidades é que as stored procedures são de extrema importância para os DBAs e desenvolvedores. Há 5 Procedimentos (Procedures) básicos que podemos criar:

• Procedimentos Locais - São criados a partir de um banco de dados do próprio usuário;

• Procedimentos Temporários - Existem dois tipos de procedimentos temporários: Locais, que devem começar com # e Globais, que devem começar com ##;

• Procedimentos de Sistema - Armazenados no banco de dados padrão do SQL Server (Master), podemos indentifica-los com as siglas sp, que se origina de stored procedure. Tais procedures executam as tarefas administrativas e podem ser executadas a partir de qualquer banco de dados.

• Procedimentos Remotos - Podemos usar Queries Distribuídas para tais procedures. São utilizadas apenas para compatibilidade.

• Procedimentos Estendidos - Diferente dos procedimentos já citados, este tipo de procedimento recebe a extensão .dll e são executadas fora do SGBD SQL Server. São identificadas com o prefixo xp.

Quando utilizar procedures

• Quando temos várias aplicações escritas em diferentes linguagens, ou rodam em plataformas diferentes, porém executam a mesma função.

• Quando damos prioridade à consistência e segurança.

Os bancos (Itaú, Bradesco, Real, etc), por exemplo, em geral, utilizam stored procedures para todas as operações em comum. Os procedimentos podem assegurar que as operações sejam registradas de forma correta e segura. Por que é mais seguro?

Seguindo a linha de raciocínio dos bancos, utilizando stored procedures outras aplicações e usuários não conseguiriam nenhum tipo de acesso às tabelas do banco de dados de forma direta.

Eles poderiam apenas executar as stored procedures, que rodam ações específicas e determinadas pelos DBAs e desenvolvedores. Criando uma stored Procedure

Este é um exemplo de uma stored procedure que executa uma consulta utlizando um filtro por descrição, em uma tabela específica de nosso banco de dados.

Page 4: Views - Procedures - Triggers

ITB - Instituto Técnico de Barueri Brasílio Flores de Azevedo Leandro Angelo Alberti – 1º Semestre 2009 - LECO

Pág. 4

USE BancoDados GO CREATE PROCEDURE Busca --- Declarando o nome da procedure

@CampoBusca VARCHAR (20) --- Declarando variável (note que utilizamos --- o @ antes do nome da variável)

AS SELECT Codigo, Descrição --- Consulta FROM NomeTabela WHERE Descricao = @CampoBusca --- Utilizando variável como filtro para a --- consulta

Para executar uma procedure basta utiilizar a cláusula EXECUTE seguido pelo nome da procedure e na frente o valor a ser utilizado como parâmetro.

Exemplo:

EXECUTE Busca 'iMasters' O que nos retornaria o seguinte resultado:

Para deletar uma procedure é necessário utilizar a cláusula DROP PROCEDURE como no exemplo abaixo. DROP PROCEDURE Busca.

EXEMPLOS:

-- Faça uma procedure que recebe o código do funcionario e um percentual de -- aumento salarial como parâmetro de entrada. Verifique o salario deste -- funcionário e o seu sexo. -- Se Sexo = 'F' e Salario < 1000 Aplique o aumento salarial CREATE PROCEDURE P_AumentaSalFunc @Codigo int, @Aumento decimal(5,2) AS DECLARE @Sexo char(01), @Salario Moeda SELECT @Codigo = Cod_Func, @Salario = Sal_Func FROM Funcionarios WHERE Cod_Func = @Codigo IF @Sexo = 'F' AND @Salario < 1000 Begin UPDATE Funcionarios SET Sal_Func = Sal_Func * @Aumento WHERE Cod_Func = @Codigo PRINT 'Aumento Concedido' End PRINT 'Aumento Negado'

Page 5: Views - Procedures - Triggers

ITB - Instituto Técnico de Barueri Brasílio Flores de Azevedo Leandro Angelo Alberti – 1º Semestre 2009 - LECO

Pág. 5

-- Faça uma procdure que recebe o código do Funcionario como parametro e um -- percentual de aumento salarial. -- Obtenha o salario e o sexo deste funcionario. -- Se Sexo = 'F' e salario menor do que 1000 -- aplique o aumento para este funcionario -- Se Sexo = 'M' -- diminua o salario deste funcionario em 100.00 CREATE PROCEDURE P_AumentaSal @Codigo int, @Aumento decimal(5,2) AS DECLARE @Salario Moeda, @Sexo Sexo SELECT @Salario = Sal_Func, @Sexo = Sexo_Func FROM Funcionario WHERE Cod_Func= @Codigo IF @Sexo = 'F' AND @Salario < 1000 Begin UPDATE Funcionario SET SAl_Func = Sal_Func * @Aumento WHERE Cod_Func= @Codigo PRINT 'Aumento concedido para a Funcionaria' End ELSE IF @Sexo = 'M' Begin UPDATE Funcionario SET Sal_Func = Sal_Func - 100 WHERE Cod_Func= @Codigo

PRINT 'Castigo aplicado para o Funcionario' End

Ref.: http://imasters.uol.com.br/artigo/7932/bancodedados/dominando_stored_procedures/ e Apostila SQL Impacta Mód. 2.

Page 6: Views - Procedures - Triggers

ITB - Instituto Técnico de Barueri Brasílio Flores de Azevedo Leandro Angelo Alberti – 1º Semestre 2009 - LECO

Pág. 6

Triggers

Assim como um gatilho dispara um projétil de uma arma para que este possa acertar o seu alvo, da mesma maneira um trigger dispara uma série de ações para cumprir um objetivo específico.

Muitas pessoas possuem dúvidas de como fazer tais disparos de ações em uma base de dados. Em vista desta necessidade, nessa matéria veremos o conceito de triggers e como criá-los baseado

no Transact-SQL. Um trigger é automaticamente executado quando um comando do tipo INSERT, DELETE ou

UPDATE é executado em uma tabela. A principal aplicação de uma trigger é a criação de restrições de acesso ao banco de dados, como

rotinas de segurança. Em vez de deixarmos o controle da aplicação para a própria tabela, passamos a executar por meio

de triggers, ou gatilhos, esses controles, tornando muito mais seguro o manuseio de nossa base de dados. Entre as várias utilidades de um trigger, podemos destacar:

• Criar mecanismos de validação, os quais envolvam pesquisas em mais de uma tabela; • Inserir o conteúdo de uma coluna derivada de outras colunas; • Atualizar outras tabelas em função de inclusão ou alteração de dados da tabela que estamos

utilizando; • Criação de logs, ou registros de inclusão e alterações de usuários.

Há outras aplicações que podemos fazer com triggers, isso depende da necessidade do

desenvolvedor ou DBA. Devemos ter em mente dois importantes aspectos de um trigger: Primeiramente que a ação executada pelo trigger é o bloco Transact-SQL que criamos e que um

trigger pode ser acionado pelos comandos INSERT, DELETE e UPDATE além de poder ser chamado quando mais de uma ação ocorrer;

Limitações do uso de um trigger

• Um trigger pode executar comandos contidos em seu corpo ou acionar uma stored procedure e outros triggers para executar determinadas tarefas;

• Pode-se especificar qualquer comando SET dentro de um trigger. • Ele permanecerá ativo durante toda a execução do trigger; • Não é possível criar um trigger para uma visão. Porém, quando uma visão é utilizada, os triggers da

tabela que está sendo utilizada são normalmente acionados; • Quando um trigger é executado os resultados são retornados para a aplicação que o chamou. • Para evitar o retorno de resultados, recomenda-se não utilizar comandos SELECT que retornem

resultados ou que executem a atribuição de conteúdo a variáveis. • O comando TRUNCATE TABLE não consegue ser interceptado por um trigger do tipo DELETE. • O comando WRITETEXT não ativa um trigger;

Há também certos comandos Trasact-SQL que não podem ser utilizados dentro de um trigger como,

por exemplo: ALTER DATABASE, ALTER PROCEDURE, CREATE DATABASE, CREATE INDEX, DROP DATABASE, DROP PROCEDURE, entre outros.

Criando um trigger

Page 7: Views - Procedures - Triggers

ITB - Instituto Técnico de Barueri Brasílio Flores de Azevedo Leandro Angelo Alberti – 1º Semestre 2009 - LECO

Pág. 7

Um trigger pode ser criado com o uso do Transact-SQL CREATE TRIGGER, ou por meio do enterprise manager.

Nos dois casos é necessária a digitação dos comandos SQL.

Exemplo de criação de um trigger: CREATE TRIGGER nome_do_trigger 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 ] } }

Onde:

ON - Indica a tabela ou visão para o qual o trigger está sendo criado;

FOR - Deve ser seguido do tipo de comando ou comandos que disparam o trigger;

AFTER - Especifica que o trigger é disparado apenas quando todas as operações especificadas no comando de disparo forem executadas com sucesso. Todas as ações contraints devem ter sido bem sucedidas antes de o trigger ser executado. AFTER é padrão se apenas FOR for especificado.Os triggers do tipo AFTER não pode ser definidos em visões;

INSTEAD OFF - Especifica que o trigger é executado em vez do comando de disparo desse trigger, ou seja, em vez do comando INSERT, o trigger será executado. Podem existir triggers INSTEAD OF para cada comando INSERT, UPDATE.

Os triggers INSTEAD OF não são permitidos em visões com a opção WITH CHECK OPTION.

Exemplo prático de um trigger

Neste exemplo imagine que possuímos uma tabela onde ficam armazenados artigos. A cada alteração feita na tabela imprimirá uma mensagem na tela 'Artigo alterado com sucesso!'. CREATE TRIGGER TRG_Artigos ON Artigos FOR INSERT, UPDATE AS PRINT('Artigo alterado com sucesso!')

GO

Para alterar um trigger usamos o comando ALTER TRIGGER nome_do_trigger. Para excluir um trigger util izamos o comando DROP TRIGGER nome_do_trigger. Lembrando que se a tabela que contém o trigger for eliminada o trigger também será.

Page 8: Views - Procedures - Triggers

ITB - Instituto Técnico de Barueri Brasílio Flores de Azevedo Leandro Angelo Alberti – 1º Semestre 2009 - LECO

Pág. 8

EXEMPLOS: EXEMPLO 1 -- Faça um trigger de inclusão na tabela funcionario que insere uma linha na -- tabela de Premio a cada vez que um funcionario do sexo feminino for inserido -- na tabela. O valor do premio deverá ser de 200.00 ALTER TRIGGER T_IncFunc ON Funcionarios FOR INSERT AS DECLARE @CodFunc int, @Sexo char(1), @CodPremio int SELECT @CodFunc = Cod_Func, @Sexo = Sexo_Func FROM Inserted IF @Sexo = 'F' Begin SELECT @CodPremio = Max(Cod_Premio) FROM Premio SET @CodPremio = @CodPremio + 1 INSERT Premio VALUES(@CodPremio,@CodFunc,getdate(),200.00,'0') End

EXEMPLO 2: -- No database siscom crie a tabela abaixo: CREATE TABLE Hist_Func ( Cod_Func int not null, Sal_Antigo decimal(10,2) not null, Sal_Atual decimal(10,2) not null, Data_Atual smalldatetime not null ) -- Faça um trigger de update na tabela funcionário que insira um registro na -- tabela Hist_Sal a cada vez que o salário de um dos funcionários for alterado. CREATE TRIGGER T_GeraHist ON Funcionarios FOR UPDATE AS DECLARE @SalAntigo decimal(10,2), @SalAtual decimal(10,2), @Codigo int SELECT @Codigo = inserted.Cod_Func, @SalAtual = inserted.Sal_Func, @SalAntigo = deleted.Sal_Func FROM inserted INNER JOIN deleted ON inserted.Cod_Func = deleted.Cod_Func IF @SalAntigo <> @SalAtual INSERT Hist_Func VALUES(@Codigo,@SalAntigo,@SalAtual,getdate())

Ref.: http://imasters.uol.com.br/artigo/8283/sql_server/triggers_em_transact_-_sql/ e Apostila SQL Impacta Mód. 2.