Escolar Documentos
Profissional Documentos
Cultura Documentos
USE PROJE2016
/*
*/
/*Adiciona a coluna CodCurso como chave prim�ria e a coluna CodEscola como chave
estrangeira da tabela escola na tabela cursoidioma*/
alter table cursoidioma add CodCurso numeric(18,0) identity primary key
alter table cursoidioma add CodEscola numeric(18,0) references escola(CodEscola)
/*Adiciona a coluna CodTurma como chave prim�ria e a coluna CodCurso como chave
estrangeira da tabela cursoidioma na tabela turma*/
alter table turma add CodTurma numeric(18,0) identity primary key
alter table turma add CodCurso numeric(18,0) references cursoidioma(CodCurso)
/*Adiciona a coluna CodAluno como chave prim�ria e a coluna CodTurma como chave
estrangeira da tabela turma na tabela aluno*/
alter table aluno add CodAluno numeric(18,0) identity primary key
alter table aluno add Idade int
/*
##### A - Subconsultas ##### */
--PROBLEMA
/*1. D� exemplo de um comando utilizando subconsultas que utilize o operador = ou
<,>, <= etc. */
--PROBLEMA
/* 2. D� exemplo de um comando utilizando subconsultas que utilize o operador in.
*/
on
t.CodTurma = m.CodTurma
on
--PROBLEMA
/*3. D� exemplo de um comando utilizando subconsultas que utilize o operador not
in.*/
select CodEscola, Nome, Cidade from escola where Cidade not in (select Cidade from
aluno)
--PROBLEMA
/* 4. D� exemplo de um comando utilizando subconsultas que utilize o operador
exists */
Para comprovar essa explica��o, o mesmo comando foi refeito, agora ele ser� igual a
apenas a um valor t.CodCurso = 4..
Agora, se for falsa ou seja se a subconsulta n�o selecionar nenhuma linha (Numero
de linhas = 0) a consulta externa n�o � executada.
*/
select Nivel from turma where EXISTS ( select * from cursoidioma c inner join turma
t on t.CodCurso = c.CodCurso) --�nico comando v�lido, os demais foi apenas para
exemplifica��o do que o comando faz
select Nivel from turma where EXISTS ( select * from cursoidioma c inner join turma
t on t.CodCurso = 4) --Comando v�lido, ter� o mesmo efeito do comando acima
select Nivel from turma where EXISTS ( select * from cursoidioma c inner join turma
t on t.CodCurso = -10) --Condi��o falsa, a consulta externa n�o chega a ser
executada
--PROBLEMA
/* 5. D� exemplo de um comando utilizando subconsultas que utilize o operador not
exists. */
*/
select Nivel from turma where NOT EXISTS( select * from cursoidioma c inner join
turma t on t.CodCurso = -90) -- �nico comando v�lido, os demais foi apenas para
exemplifica��o do que o comando faz
select Nivel from turma where NOT EXISTS( select * from cursoidioma c inner join
turma t on t.CodCurso = c.CodCurso) --Condi��o verdadeira, a consulta externa n�o
chega a ser executada
select Nivel from turma where NOT EXISTS( select * from cursoidioma c inner join
turma t on t.CodCurso = 1) --Condi��o verdadeira, a consulta externa n�o chega a
ser executada
--PROBLEMA
/* 6. D� exemplo de uma subconsulta utilizada dentro de um comando Update. */
--seleciona toda a informa��o da tabela matricula antes que o comando abaixo seja
executado
select * from matricula
update matricula set Nota = Nota * 1.1 where Nota = (select min(Nota) from
matricula)
--PROBLEMA
/* 7. D� exemplo de uma subconsulta utilizada dentro de um comando Delete. */
/*
##### B - Transact SQL ##### */
--PROBLEMA
/* 8. Escreva uma fun��o que seja �til para a l�gica de neg�cios de seu sistema e
indique o contexto de sua utiliza��o. */
/* -----
Esse metodo de negocio � usado function table que retorna o nome dos alunos na
consulta mais externa, e na consulta mas interna ( subcosulta) retorna
a nota do aluno e a nota que for maior ou igual a passada por par�metro ganhar� uma
viagem para o pais de origem do curso de lingua em que se est�
matriculado.
Obs.: Pode haver mais de um ganhador, podendo inclusive todos os alunos ganhar a
viagem.
*/
FROM
matricula m
--seleciona todos os dados da tabela matricula para que possa ver a nota e utilizar
na fun��o
select * from matricula
--PROBLEMA
/* 9. Escreva uma Stored Procedure que implemente uma regra de neg�cio de sua
aplica��o.Explique qual � e o porque desta regra ser implementada no SGBD. */
/* O comando pega o nome do aluno matriculado na escola e sua idade, aquele cujo a
idade � maior ou igual a 40 tem um desconto
na mensalidade para incentivar pessoas a estudarem outro idioma.O desconto ser� de
45%.
Esta regra foi implementado no SGBD para facilitar as tarefas internas que ser�o
realizadas pelos funcion�rios da escola e tamb�m para dar seguran�a a informa��o,
n�o podendo o aluno que j� recebeu desconto mentir e isso vale para aqueles que
tamb�m n�o atendem o requisito necess�rio para receber o desconto que � a idade.
*/
FROM aluno
aluno a
inner join matricula m
on
a.CodAluno =
m.CodAluno and a.CodAluno = @Idaluno
inner join
turma t
on
t.CodTurma =
m.CodTurma
inner join
cursoidioma ci
on
ci.CodCurso
= t.CodCurso
ELSE
BEGIN
print @ret +' n�o recebe desconto. Por n�o ter idade
compativel ou por j� possuir desconto.'
END
END
exec spImpleNegocio 4
/* O comando abaixo recebe o c�digo do aluno como par�metro, baseado nisso mostra
quantas aulas (total) o aluno teve at�
o momento da consulta e verifica quantas faltas e presen�a o mesmo possu� em
rela��o ao total de aulas*/
open curp
while @@FETCH_STATUS = 0
begin
close curp
deallocate curp
print'Total de Aulas que o aluno teve at� agora:'
print +@soma
print 'Quantidade de Presenca: '
print @contador
end
--PROBLEMA
/* 11. Escreva um trigger para suportar auditoria quanto � exclus�o, altera��o e
inclus�o de registros da seguinte forma:
Toda vez que um registro for inclu�do, exclu�do ou alterado da tabela principal de
seu sistema, o trigger dever� gravar uma tabela de log com:
Para exclus�o: data e hora da opera��o, chave do registro exclu�do, nome da tabela
e o usu�rio que disparou a exclus�o.
Para inclus�o: data e hora da opera��o, chave do registro inclu�do, nome da tabela
e o usu�rio que disparou a inclus�o.
Para altera��o: data e hora da opera��o, chave do registro alterado, nome da tabela
e o usu�rio que disparou a altera��o, valor anterior e atual do campo alterado. */
--O Codigo cria a Trigger para fazer o Log das informa��es na tabela "Logs" ap�s
alguma linha da tabela Escola (Tabela Principal) ser deletada.
--Ap�s a exclus�a�, a trigger declara uma variavel que representa o usuario logado
que deletou o dado, e faz o adiciona a informa��o na tabela Logs.
--Dar� um erro devido as depemdencias com outras tabelas, tentamos deletar as
linhas das tabelas afetadas mas deixamos como comentario na Trigger
select*from escola
select*from escola
select*from logs
-- Ap�s uma adi��o de dado feito na tabela Escola, o codigo abaixo simula um
usuario logado declarando um variavel, e insere o acrecimo feito na tabela log.
end
-- Essa trigger � acionada ap�s alguma atualiza��o na tabela escola, ela simula um
usuario do sistema e adiciona o valor alterado (antigo) e o novo valor, na tabela
Logs.
-- O codigo checa coluna a coluna para poder registrar o valor correto na tabela
Logs.
if update (nome)
begin
insert into Logs values
('Altera��o',getdate(),'Escola',(select CodEscola from inserted),
(select Nome from Usuario where CodUsuario = @UsuarioLogado),(select Nome from
deleted),(select Nome from inserted))
end
else if update (Cidade)
begin
insert into Logs values
('Altera��o',getdate(),'Escola',(select CodEscola from inserted),
(select Nome from Usuario where CodUsuario = @UsuarioLogado),(select Cidade from
deleted),(select Cidade from inserted))
end
else if update (Estado)
begin
insert into Logs values
('Altera��o',getdate(),'Escola',(select CodEscola from inserted),
(select Nome from Usuario where CodUsuario = @UsuarioLogado),(select Estado from
deleted),(select Estado from inserted))
end
else if update (CEP)
begin
insert into Logs values
('Altera��o',getdate(),'Escola',(select CodEscola from inserted),
(select Nome from Usuario where CodUsuario = @UsuarioLogado),(select CEP from
deleted),(select CEP from inserted))
end
else if update (Bairro)
begin
insert into Logs values
('Altera��o',getdate(),'Escola',(select CodEscola from inserted),
(select Nome from Usuario where CodUsuario = @UsuarioLogado),(select Bairro from
deleted),(select Bairro from inserted))
end
else if update (Email)
begin
insert into Logs values
('Altera��o',getdate(),'Escola',(select CodEscola from inserted),
(select Nome from Usuario where CodUsuario = @UsuarioLogado),(select Email from
deleted),(select Email from inserted))
end
else if update (Telefone)
begin
insert into Logs values
('Altera��o',getdate(),'Escola',(select CodEscola from inserted),
(select Nome from Usuario where CodUsuario = @UsuarioLogado),(select Telefone from
deleted),(select Telefone from inserted))
end
else if update (CNPJ)
begin
insert into Logs values
('Altera��o',getdate(),'Escola',(select CodEscola from inserted),
(select Nome from Usuario where CodUsuario = @UsuarioLogado),(select CNPJ from
deleted),(select CNPJ from inserted))
end
else if update (Endereco)
begin
insert into Logs values
('Altera��o',getdate(),'Escola',(select CodEscola from inserted),
(select Nome from Usuario where CodUsuario = @UsuarioLogado),(select Endereco from
deleted),(select Endereco from inserted))
end
else if update (DataCadastro)
begin
insert into Logs values
('Altera��o',getdate(),'Escola',(select CodEscola from inserted),
(select Nome from Usuario where CodUsuario = @UsuarioLogado),(select DataCadastro
from deleted),(select DataCadastro from inserted))
end
--PROBLEMA
/* 12. De acordo com o tema escolhido, escreva um trigger para realizar uma a��o
autom�tica que seja necess�ria para o sistema manter a integridade dos dados.
Exemplo:
Cada vez que for inserida a matr�cula de um aluno no curso, diminuir o n�mero de
vagas dispon�veis no curso => para tema da Escola de Idiomas
Cada vez que uma loca��o for encerrada, calcular o total de pontos de fidelidade =>
para tema da Locadora de ve�culos
Atualizar o saldo banc�rio cada vez que ocorrer um lan�amento de d�bito ou
cr�dito=> para o Tema de Contas correntes banc�rias.
Etc. */
--DESCRI��O DO QUE O COMANDO FAZ
*/
begin
on
i.CodTurma = t.CodTurma
on
c.CodCurso = t.CodCurso
insert into matricula select Nota, DataMatricula, CodTurma, CodAluno from inserted
end
else
begin
raiserror('O curso escolhido nao possui mais vagas dispon�veis, a turma atual est�
completa!', 13,1,1)
end
end
--O comandos Abaixo servem Apenas para testar o trigger acima
--PROBLEMA
/* 13. Escreva um procedimento que necessite da utiliza��o de cursores.
Lembre-se o uso de cursores � interessante quando precisamos trabalhar com um
conjunto de linhas e tratando cada linha de maneira individual. */
open curaluno
while @@FETCH_STATUS = 0
begin
print @contador
print 'Nome do Aluno: ' +@NomeAluno
print 'Cidade do Aluno: ' +@Cidade
print 'Endereco do Aluno: ' +@Endereco
print 'Telefone do Aluno: ' +@Telefone
print''
close curaluno
deallocate curaluno