Buscar

TODAS APOSTILAS LABBD

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 108 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 108 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 108 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

SQL - DML
1
SELECT
 A estrutura básica de uma consulta em SQL consiste em três cláusulas: 
SELECT, FROM e WHERE
2
SELECT
 Corresponde à operação de PROJEÇÃO da álgebra relacional. Ela é 
usada para listar os atributos desejados como resultado de uma 
consulta
3
FROM
 É uma lista de relações a serem varridas na execução da expressão
 A princípio, para consultas, a utilização do SELECT e FROM são 
obrigatórios em qualquer consulta
4
WHERE
 Corresponde ao predicado de seleção da álgebra relacional. Consiste 
em um predicado envolvendo atributos das relações que aparecem na 
cláusula FROM.
 As cláusulas ainda podem ser ainda ser compostas com outras 
cláusulas utilizando operadores lógicos AND e OR
5
SELECT
 Seleção de colunas específicas
 Seleção de todas as colunas
6
SELECT
 Eliminação de Duplicações
 Utilização de pseudônimos (alias)
7
WHERE
 Objetivo: filtrar um conjunto de linhas de uma tabela ou um conjunto 
delas
 Operadores:
 =, <>, <, >, IS NULL, IN, BETWEEN, NOT, LIKE
8
Exemplo
9
1) Quais são os funcionários de Juiz de Fora?
2) Quais são os funcionários que possuem carteira de motorista?
3) Quais são os funcionários do sexo feminino?
4) Quais são os funcionários que o nome começa com a letra M?
5) Quais são os funcionários com idade superior a 40 anos?
Exemplo - Respostas
10
Exemplo
 Conjunção e Disjunção de condições
 1) Quais são os funcionários de Juiz de Fora que 
são do sexo masculino?
 2) Quais são os funcionários que tem carteira de 
habilitação e são do sexo feminino?
 3) Quais são os funcionários que recebem mais 
que R$ 750,00 e possuem mais de 30 anos de 
idade?
 4) Quais são os funcionários do sexo masculino 
OU funcionários que o nome começa com a letra 
J?
11
Exemplo - Respostas
12
ORDER BY
 Objetivo: ordenar o resultado de uma consulta
 A ordenação é feita pelas colunas indicadas na cláusula
 ASC  Ordenação crescente
 DESC  Ordenação decrescente
13
Exemplo
14
1) Ordene os registros pelo nome 
de maneira ascendente
2) Ordene os registros pelo código
3) Ordene os registros pela idade 
de maneira decrescente
Exemplo - Respostas
15
JOIN
 Objetivo: combinar linhas de tabelas diferentes, através de valores 
comuns em colunas correspondentes (basicamente a ligação ocorre 
através da chave estrangeira)
 No JOIN as colunas e os dados de ambas as tabelas que estão 
envolvidas são trazidas no resultado por isto ele é utilizado.
16
JOIN
 Como você construiria consultas que 
respondessem as perguntas abaixo:
 1) Quais os nomes dos departamentos que possuem 
empregados que ganham mais de R$ 1000,00?
 2) Qual o nome do funcionário e o nome do 
departamento que ele trabalha?
 3) Qual o preço de cada produto que o cliente Luiz 
Felipe comprou na nota fiscal número 000456?
 4) Quais os nomes dos alunos que obtiveram nota 
maior que 80 na disciplina DCC060?
17
JOIN
 O que se percebe na verdade, é que as informações requeridas estão 
em mais de uma tabela ao mesmo tempo, por isto a necessidade de 
se fazer a junção de tabelas para retornar os dados necessários. O 
JOIN mais comum é o INNER JOIN que simplesmente retorna todas as 
linhas que contém o mesmo valor para o campo que faz a ligação 
entre as duas tabelas.
18
INNER JOIN
 Retorna todas as linhas da relação R1 e da relação R2 que possuem o 
mesmo valor para o campo em que foi feito o JOIN
 1) Quais os nomes dos departamentos que possuem empregados que 
ganham mais que R$ 1000,00?
 2) Qual o nome do funcionário e o nome do departamento que ele 
trabalha?
19
Respostas (1)
20
Respostas (2)
21
LEFT JOIN
 Primeiramente um INNER JOIN é realizado. Depois, para cada linha da 
relação R1 que não satisfaz a condição do JOIN, é concatenada ainda 
as colunas da relação R2 porém com valores nulos. Em outras 
palavras, traz todos os registros de R1, os que satisfazem o JOIN e os 
que não satisfazem.
22
LEFT JOIN
 1) Retorne tantos os alunos que ingressaram no ano de 2005 que estão 
matriculados na disciplina DCC060 quanto os que não estão.
 2) Retorne tantos os empregados que estão alocados para o projeto 
‘GED’ quanto os que não estão.
23
Respostas (1)
24
Respostas (2)
25
Esta consulta já não é tão trivial, pois exige além de um LEFT 
JOIN um INNER JOIN e a informação que precisa retornar está 
espalhada entre 3 tabelas diferentes
Respostas (2) - Continuação
26
RIGHT JOIN
 Primeiramente um INNER JOIN é realizado. Depois, para cada linha da 
relação R2 que não satisfaz a condição do JOIN, é concatenada ainda 
as colunas da relação R1 porém com valores nulos. Em outras 
palavras, traz todos os registros de R2, os que satisfazem o JOIN e os 
que não satisfazem. É o caminho inverso do LEFT JOIN
27
RIGHT JOIN
 1) Retorne todos os nomes dos produtos que foram e os que não foram 
vendidos no dia 01/12/2006.
28
Respostas (1)
29
Respostas (1) - Continuação
30
Funções de Agregação
 Objetivo: Calcular um determinado valor 
sobre um conjunto de linhas, como por 
exemplo, média, valor máximo, mínimo, 
quantas linhas foram retornadas e etc.
 Funções mais comuns:
 COUNT
 AVG
 MAX
 MIN
 SUM
31
COUNT
 Retorna a quantidade de linhas do grupo
 COUNT(*)  inclui todas as linhas (mesmo as repetidas caso haja)
 COUNT(coluna)  retorna o número de linhas com valores não nulos da 
coluna especificada
 COUNT(DISTINCT coluna)  retorna o número de linhas com valores 
distintos naquela coluna
32
COUNT
 1) Quantos são os empregados que trabalham 
no departamento financeiro? 
 2) Quantas notas fiscais foram geradas entre 
01/11/2006 e 30/11/2006?
 3) Quantos departamentos possui a empresa?
 4) Quantos alunos estão matriculados na 
disciplina DCC009 no período letivo 3-2006?
33
Respostas - COUNT
34
MAX
 Retorna o valor máximo da coluna dentro do grupo
 1) Qual o maior salário do departamento Recursos Humanos?
 2) Qual o maior salário da empresa?
 3) Qual a nota fiscal de maior valor que já foi lançada?
 4) Qual foi a maior nota na disciplina DCC060 em toda a história?
35
MAX - Respostas
36
MIN
 Retorna o valor mínimo da coluna dentro do grupo
 Qual o menor salário do departamento Recursos Humanos?
 Qual o menor salário da empresa?
 Qual a nota fiscal de menor valor que já foi lançada?
 Qual foi a menor nota na disciplina DCC060 em toda a história?
37
MIN - Respostas
38
SUM
 Retorna o somatório da coluna dentro do grupo
 1) Qual o valor da folha de pagamento do departamento Pessoal?
 2) Qual o valor das notas fiscais que foi faturado no dia 01/12/2006?
39
SUM - Respostas
40
AVG
 Retorna a média da coluna dentro do grupo
 1) Qual a média de idade do departamento de Informática?
 2) Qual foi o valor médio faturado no mês de novembro pela empresa?
41
AVG – Respostas
42
GROUP BY
 Agrupar valores vindos de funções de agregação por alguma coluna 
em especial. Por exemplo, quantos funcionários existem por 
departamento. Qual a média de idade por departamento. Quanto foi 
faturado por dia no mês de novembro. Questões como estas são 
respondidas através das funções de agregação porém utilizando ainda 
a cláusula GROUP BY
43
GROUP BY
 Um detalhe que nunca deve ser esquecido, cada coluna que aparecer 
na cláusula SELECT excetuando-se as funções de agregação devem 
obrigatoriamente aparecer na cláusula GROUP BY
44
GROUP BY
 1)Quantos funcionários existem em cada departamento da empresa?
 2) Qual a média de idade dos funcionários por departamento da 
empresa?
 3) Qual foram os valores faturados em cada dia do mês em todo o ano 
na empresa?
 4) Qual foi a média das notas dos alunos em cada disciplina do 
período letivo 3-2006?
45
GROUP BY - Respostas
46
HAVING
 Restringir os valores vindos de funções de 
agregação e cláusulas GROUP BY.
 1) Quais são os departamentos que possuem 
média salarial acima de R$ 2000,00?
 2) Quais são as disciplinas onde a média de notas 
dos alunos no período letivo 3-2006 foi acima de 
60?
 3) Quais foram os dias que o faturamento 
ultrapassou o valor de R$ 1000,00 no mês de 
julho?
47
HAVING – Respostas
48
Inserção, atualização e 
exclusão em SQL.
•49
Inserção de Dados
 Adicionando tupla/registro à tabela
INSERT INTO <tabela> (<lista 
de atributos>) VALUES 
(<valores>)
INSERT INTO Empregado(Cad, 
Nome, Sexo, Salario, Num_Dep, 
Cad_Supv) VALUES (015, ‘José 
da Silva’, ‘M’, 1000, 1, 020)
•50
insert into empregado
values (‘Richard’, ‘K’, ‘Marini’, ‘4830672’, ’13-06-
1953’, ’98, Oak Forest, TX’, ’M’, 37000, ‘3468345’, 
‘4’);
 Insira uma tupla, de um novo empregado, para o 
qual sabe-se apenas os atributos pnome, unome, 
dno e ssn.
insert into empregado(pnome, unome, dno, ssn)
values (‘Richard’, ‘Marini’, 4, ‘4830672’);
•51
 Crie uma tabela que contenha o total de 
empregados e o total de salários e cada 
departamento.
create table depts_info
(dept_nomevarchar(15),
no_de_emps integer,
total_sal integer);
insert into depts_info (dept_nome, no_de_emps, 
total_sal)
select dnome, count (*), sum (salario)
from (departamento join empregado on dnumero = 
dno)
group by dnome;
•52
Atualização de Dados
 Atualizando tuplas/registros
UPDATE <nome tabela> SET <nome
atributo> = valor WHERE <condição>
UPDATE Empregado SET Salario =
1500 WHERE Cad = 015
•53
 Exemplos de uso do comando update:
update projeto
set plocalização = ‘Bellaire’, dnum = 5
where pnumero = 10;
update empregado
set salario = salario * 1,1
where dno in (select dnumero
from departamento
where dnome = ‘Pesquisa’);
•54
Deletando Dados
 Apagando tuplas/registros da tabela
DELETE FROM <tabela> WHERE
<condição>
DELETE FROM Empregado WHERE
Salario > 5000
•55
 Exemplos de uso do comando delete:
delete from empregado
where unome = ‘Brown’;
delete from empregado
where ssn = ‘1234530’;
delete from empregado
where dno in (select dnumero
from departamento
where dnome = ‘Pesquisa’);
delete from empregado;
•56
SQL
•57
Índices
 Índices é maneira muito comum de melhorar a 
performance do banco de dados. Um índice permite ao 
servidor de banco de dados encontrar e retornar linhas 
específicas mais rapidamente do que sem índices. Mas 
índices também podem sobrecarregar o sistema de 
banco de dados, portanto deve ser usado com cuidado
•58
Índices
 Índice primário
 A chave especifica qual registro possui aquela chave e 
aponta para este registro
 Índice secundário
 Índice cuja chave não pertence a chave primária
 A entrada aponta para todos os registros que contém 
aquele valor de chave X
•59
Índices
 Sugestões
 A coluna é frequentemente utilizada na 
cláusula where
 Para as FOREIGN KEYS, pois estão 
geralmente envolvidas em JOINS
 Para as PRIMARY KEYS e UNIQUE KEYS 
normalmente o SGBD cria 
automaticamente um índice
 Observações
 Não é permitida a alteração de índices
 Normalmente, a decisão de utilizar um 
índice ou não é do sistema, não do usuário
•60
Tipos de Índices
 A grande maioria dos bancos oferecem pelo menos duas 
implementações para os índices
 B-Trees
 Hashing
 Onde as B-Trees são mais comumente utilizadas como 
estruturas que armazenam os índices
•61
B-Tree
 Definição
 Árvore de busca de ordem N
 A raiz possui no mínimo 2 filhos
 Cada folha possui no mínimo (n-1)/2 valores de chave
 Cada nó interior possui no mínimo n/2 filhos
 Todos os ramos tem o mesmo comprimento
•62
B-Tree
•63
B-Tree
•64
B-Tree
 Trabalha com consultas de igualdade 
ou comparação em dados que podem 
estar ordenados em qualquer ordem. O 
otimizados de consultas da maioria dos 
SGBDs usam o índice B-Tree nos 
campos onde foram criados quando há 
um destes operadores:
 <
 <=
 =
 >=
 >
•65
B-Tree
 Outras construções que são equivalentes aos operadores 
lógicos como BETWEEN e IN também fazem uso de 
índices B-Tree nas consultas realizadas. (Porém, 
dependendo do SGBD, a comparação IS NULL não é 
equivalente a = NULL portanto não utilizaria a estrutura 
de índices B-Tree)
•66
B-Tree
 Consultas que envolvem busca por padrões como o 
operador LIKE quando o padrão é uma constante e é 
buscado só como início da string (Ex: nome LIKE ‘Luiz%’) 
também utiliza do índice para acelerar a consulta. 
Porém qualquer coisa fora deste padrão não utiliza 
índices. Ex:
 nome LIKE ‘%a%’ OR nome LIKE ‘pe%’
•67
Índice Hashing
 São usados pelo otimizador de 
consultas somente em condições de 
igualdade (operador =)
 Não é muito utilizado pois a princípio 
é mais lento que os indíces em B-Tree 
e em alguns bancos de dados, após 
alguma queda do servidor por 
exemplo, eles precisam ser 
reindexados
 CREATE INDEX name ON table
USING hash (column); (PostgreSQL)
•68
Índice UNIQUE
 Índices UNIQUE podem ser utilizados para forçar que 
uma determinada coluna ou combinação de colunas 
terão valores únicos assim como a constraint UNIQUE
•69
Índice UNIQUE
 Quando um índice UNIQUE é criado, 
múltiplas linhas que contenham 
valores duplicados para a coluna(s) do 
índice criado não são permitidas. A 
maioria dos SGBDs como PostgreSQL 
cria automaticamente índices para 
chaves primárias e colunas UNIQUE 
definidas através de constraint por isto 
é importante definir esta situação por 
constraint e não criação de índices 
manualmente pois pode haver 
duplicação de informação
•70
Comando INSERT
 Adiciona novas linhas a tabela requerida
 Se as colunas não forem especificadas, o comando 
assume as colunas na ordem de criação das tabelas 
devendo assim ser informados tantos valores quantas 
forem as colunas da tabela
•71
Comando INSERT
 Considere a tabela abaixo:
•72
Comando INSERT
 O comando abaixo está correto?
•73
Comando INSERT
 O comando abaixo está correto?
 Temos dois problemas, pois estão faltando 2 
campos nos VALUES já que não foram 
especificados as colunas. O banco entende 
que os dados seriam inseridos na ordem das 
colunas que foram criadas
•74
Comando INSERT
 O comando abaixo está correto?
•75
Comando INSERT
 O comando abaixo está correto?
•76
Comando INSERT
 Quando omitimos alguma coluna como 
fizemos comando anterior omitindo a 
coluna registro e habilitação o SGBD 
tenta assumir para essas colunas o 
valor DEFAULT caso ele tenha sido 
definido OU tenta inserir NULL. 
Porém, o NULL depende da 
obrigatoriedade definida ao se criar a 
tabela, pois se for obrigatória o valor 
da coluna, o comando não será 
executado com sucesso
•77
Comando INSERT
 O comando abaixo está correto?
•78
Comando INSERT
 Na maioria dos SGBDs comerciais é possível fazer 
inserções utilizando como entrada retornos de uma 
consulta que foi realizada. Alguns bancos aceitam que e 
em único comando INSERT possam ser inseridos vários 
dados de uma vez como o PostgreSQL porém isso 
depende de implementação do SGBD
•79
ComandoINSERT
•80
Comando UPDATE
 O objetivo é atualizar um registro ou um 
conjunto de registros nas colunas 
indicadas no comando que satisfazem as 
condições estabelecidas na cláusula 
WHERE recebendo os novos valores que 
são passados ou até mesmo valores vindos 
de outras tabelas. Somente as colunas 
especificadas no comando são atualizadas
•81
Comando UPDATE
 Table  Qual tabela terão registros atualizados
 Alias  Apelido que pode ser utilizado para se 
referenciar a tabela, porém qualquer campo abaixo vai 
ser referenciado por alias.nome_campo
 Column  Qual coluna da tabela que terá os valores 
alterados
•82
Comando UPDATE
 Expression  A expressão que será atribuída 
a coluna. Pode ser uma constante, pode ser o 
resultado de uma stored procedure desde que 
ela retorne um resultado compatível com o 
tipo de dados do campo, pode ser ainda o 
valor vindo de outro campo de outra tabela e 
até mesmo o valor do próprio campo sendo 
usado com alguma operação como operações 
aritméticas por exemplo
 Fromlist  Assim como nas consultas 
(SELECTs), no comando UPDATE é possível 
trazer dados de outras tabelas para um 
possível join ou satisfazer alguma condição na 
cláusula WHERE
•83
Comando UPDATE
 Condition  Uma expressão que retorna um valor 
booleano. Somente os registros que atenderem a estas 
condições são afetados pelo UPDATE
•84
Comando UPDATE
 Pode-se ainda atualizar linhas a partir de outra tabela
•85
Comando UPDATE
 Considere mais uma vez a estrutura
•86
Comando UPDATE
 O que o comando abaixo realiza?
•87
Comando UPDATE
 É preciso sempre verificar atento as condições na 
cláusula WHERE pois qualquer erro pode representar 
uma atualização numa quantidade de registros muito 
grande ou até mesmo em toda a tabela causando um 
problema de última hora para voltar com as 
informações no seu estado anterior
•88
Comando UPDATE
•89
Comando DELETE
 Comando para excluir as linhas de uma tabela que 
satisfazem uma condição
 É importante não confundir DELETE com DROP, o 
comando DROP destrói toda a estrutura inclusive os 
dados de uma tabela, enquanto o DELETE manipula 
dados de uma tabela, porém a estrutura sempre é 
mantida e nunca é afetada
•90
Comando DELETE
•91
Sintaxe:
Apaga um conjunto de linhas que 
satisfazem a condição indicada:
Apaga todas as linhas da tabela Depto já 
que nenhuma condição foi indicada:
92
Banco de Dados
SQL
TRIGGERS (Gatilhos)
93
TRIGGERS (GATILHOS)
 Uma TRIGGER é um tipo especial de sp que é executado automaticamente 
em conseqüência de uma modificação (INSERT, UPDATE, DELETE) na tabela na 
qual a TRIGGER foi configurada.
 Chama-se disparar a trigger a execução automática da mesma
 Não podem ser executadas usando EXEC.
94
 Uma TRIGGER é sempre associada a uma tabela, porém os comandos que 
formam a TRIGGER podem acessar dados de outras tabelas. 
 Ex: dadas as tabelas
Nota_Fiscal(Num_nota, valor_total)
Produto(Cod_Prod, nome, preço, estoque)
Nota_Prod(Num_nota, Cod_Prod, quantidade)
Pode-se criar uma Trigger para a operação de INSERT na tabela Nota_Prod. 
Sempre que for inserido um novo item de pedido na tabela Nota_Prod será 
disparada um Trigger que atualiza o nível de estoque do produto que está 
sendo vendido
95
 Com o uso de TRIGGERs pode-se definir “Regras de Negócio” do BD
 Representam regras do “mundo real”
 Ex: Aprovar financiamento maiores que um determinado valor
 Pode-se usar TRIGGERS para exclusão e atualização em cascata
 Se o comando que está sendo executado violar a definição de uma 
CONSTRAINT definida, a TRIGGER não irá disparar
96
 NO SQLServer 2000/2005 existem alguns tipos de 
TRIGGERS:
 DELETE
 UPDATE AFTER
 INSERT
 INSTEAD OF
 AFTER: é disparada APÓS todos os comandos de uma 
TRIGGER associada com um DELETE, UPDATE e INSERT 
terem sidos executados
 INSTEAD OF é disparada ANTES dos comandos serem 
executados. Processa as constraints antes da execução 
da trigger. 
97
 O SQLServer 2000/2005 permite especificar TRIGGERs em Views (INSTEAD 
OF)
 Nos comandos que definem a TRIGGER pode-se usar a maioria dos 
comandos SQL, inclusive estruturas IF..ELSE e WHILE.
 Não são permitidos os seguintes comandos: ALTER DATABASE, CREATE 
DATABASE, DROP DATABASE, LOAD DATABASE, LOAD LOG, RESTORE 
DATABASE, RESTORE LOG, RECONFIGURE 
98
 Os comandos que compõe a TRIGGER tem acesso a duas tabelas especiais:
 DELETED TABLE
 INSERTED TABLE
 Essas tabelas existem apenas na memória do servidor, não sendo gravadas 
em disco
 Os registros dessas tabelas são acessíveis somente durante a execução da 
TRIGGER
 Para referenciar essas tabelas temporárias dentro da TRIGGER usa-se os 
nomes
 DELETED
 INSERTED
99
 A tabela DELETED armazena cópias de registros afetados por um comando 
DELETE ou UPDATE
 Armazena os registros antes da alteração
 A tabela INSERTED armazena cópias dos registros afetados por um 
comando INSERT ou UPDATE. 
 Os registros na tabela INSERTED são cópias dos novos registros da tabela da 
tabela que disparou a TRIGGER
100
 Sintaxe:
CREATE TRIGGER nome_da_trigger
ON nome_da_tabela ou nome_da_view
[WITH ENCRYPTION]
{FOR | AFTER| INSTEAD OF}
{[DELETE] [,] [INSERT] [,] [UPDATE]}
AS
comando 1
comando 2
.....
comando n
101
 Exemplo: Criar uma TRIGGER que evite que sejam 
inseridos novos clientes na tabela CLIENTE (banco de 
dados LOCADORA) em que o compo UF seja igual a 
‘AC’ ou ‘PA’. Essa TRIGGER será criada para a ação 
INSERT.
CREATE TRIGGER TG_Permite_UF
ON Cliente
FOR INSERT
AS
IF EXISTS (SELECT * 
FROM INSERTED
WHERE UF_CLI IN ('PA', 'AC'))
BEGIN
PRINT 'INSERÇÃO DE REGISTRO CANCELADA.'
PRINT 'ESTADO (UF) PROIBIDO!!'
ROLLBACK
END
ELSE
102
 Crie uma TRIGGER calcule e insera a data de devolução prevista na 
tabela EMP_DEV sempre que uma fita for emprestada
CREATE TRIGGER tg_CALCULA_DATA_DEV_PREV
ON EMP_DEV
FOR INSERT 
AS 
IF EXISTS (SELECT * FROM INSERTED)
BEGIN
UPDATE EMP_DEV
SET DATA_DEV_PREV = DATEADD(DD,1,DATA_EMP)
END
103
 Crie uma TRIGGER que calcule e insira a data de 
devolução prevista na tabela EMP_DEV sempre que 
uma fita for emprestada. Se a fita for de catálogo 
ela tem dois dias para ser entregue. Lançamentos 
podem ficar locadas apenas 1 dia.
alter table Fita
add Tipo_fita varchar (10) 
Constraint CKTipo_fita check (Tipo_fita in 
('catálogo','Lançamento'))
DROP TRIGGER tg_CALCULA_DATA_DEV_PREV
104
CREATE TRIGGER tg_CALCULA_DATA_DEV_PREV
ON EMP_DEV
FOR INSERT 
AS 
IF EXISTS (SELECT * FROM INSERTED INNER JOIN FITA ON 
FITA.COD_FITA = INSERTED.COD_FITA
WHERE Tipo_fita = 'catálogo')
BEGIN
UPDATE EMP_DEV
SET DATA_DEV_PREV = DATEADD(DD,2,DATA_EMP)
WHERE emp_dev.cod_fita = (select inserted.cod_fita from inserted)
END
ELSE
IF EXISTS (SELECT * FROM INSERTED INNER JOIN FITA ON 
FITA.COD_FITA = INSERTED.COD_FITA
WHERE Tipo_fita = 'Lançamento')
BEGIN
UPDATE EMP_DEV
SET DATA_DEV_PREV = DATEADD(DD,1,DATA_EMP)
105
 Crie uma TRIGGER que calcule o valor da multa de um 
cliente sempre que o mesmo devolver a fita à locadora. Isso 
significa que toda a vez que o campo “dev_efet” for 
preenchido (UPDATE) a multa será calculada.
CREATE TRIGGER tg_CALCULA_MULTA
ON EMP_DEV
FOR UPDATE
AS 
IF UPDATE (DATA_DEV_EFET) 
BEGIN
UPDATE EMP_DEV
SET multa = 1.5 * DATEDIFF(DD,DATA_DEV_PREV,DATA_DEV_EFET) 
WHERE DATEDIFF(DD,DATA_DEV_PREV,DATA_DEV_EFET) > 0 END 
IF UPDATE (DATA_DEV_EFET) 
BEGIN
UPDATE EMP_DEVSET multa = 0
WHERE DATEDIFF(DD,DATA_DEV_PREV,DATA_DEV_EFET) <= 0 END
106
 Vamos supor que, por ordem da admistraçao não seja 
permitido fazer alterações e inserções na tabela 
Fornecedor. Para garantir esta norma implemente um 
trigger que dispare em resposta a comandos UPDATE 
e INSERT na tabela Fornecedor. Esta trigger deve 
emitir um aviso de que as alterações e inserções 
foram suspensas e registrar em uma tabela o nome 
do usuário que tentou fazer a alteração e o nome do 
fornecedor que tentou-se alterar ou inserir.
CREATE TABLE TENTOU_ALTERAR
( 
FORNECEDOR VARCHAR (50) NOT NULL,
USUÁRIO CHAR (30) NOT NULL
)
107
CREATE TRIGGER Tg_NÃO_ALTERAINSERE_FORNECEDOR
ON FORNECEDOR
FOR INSERT, UPDATE
AS
-- VARIAVEL QUE SERÁ UTILIZADA NA TRIGGER
DECLARE @NOME_FORNECEDOR VARCHAR(50)
-- VERIFICA SE FOI FEITA ALGUMA ALTERAÇÃO (INSERT OU UPDATE)
IF EXISTS (SELECT * FROM DELETED)
BEGIN
SET @NOME_FORNECEDOR = (SELECT NOME_FORN FROM DELETED)
PRINT 'VC NÃO PODE ALTERAR O REGISTRO DE UM FORNECEDOR'
ROLLBACK
INSERT INTO TENTOU_ALTERAR
VALUES (@NOME_FORNECEDOR, CURRENT_USER) 
END
IF EXISTS (SELECT * FROM INSERTED)
BEGIN
SET @NOME_FORNECEDOR = (SELECT NOME_FORN FROM INSERTED)
108
Habilitando e Desabilitando 
Trigger
 Para desabilitar temporariamente uma trigger:
ALTER TABLE Nome_da_Tabela
DISABLE TRIGGER Nome_da_Trigger 
 Para habilitar novamente uma trigger:
ALTER TABLE Nome_da_Tabela
ENABLE TRIGGER Nome_da_Trigger

Continue navegando