Você está na página 1de 3

Exercícios sobre Restrições de Integridade (RIs) – SQL Server

Observação: se houver dúvidas sobre a implementação das RIs durante a resolução


dos exercícios, analise a sintaxe da criação de tabelas com restrições (create table +
check), a sintaxe de gatilhos (create trigger) e a sintaxe de stored procedures
(create procedure + exec).

1) Crie um BD chamado Universidade e defina as tabelas a seguir neste BD. Nomeie


as restrições de chave primária e estrangeira, como exemplificado:

• Professores(matricula, nome, RG, sexo, idade, titulação, categoria,


nroTurmas) – essa criação de tabela já está pronta!Veja exemplo abaixo.
o matrícula é chave primária (defina da seguinte maneira: constraint
pkProf primary key (matricula). Defina as chaves de todas as demais
tabelas desta forma;
o nome é um atributo obrigatório;
o RG é um atributo que tem valor único para cada professor;
o sexo pode ser: ‘M’ ou ‘F’;
o idade deve estar entre 21 e 80 anos;
o titulação deve ser: ‘graduado’, ‘especialista’, ‘mestre’ ou ‘doutor’;
o categoria deve ser: ‘auxiliar’, ‘assistente’, ‘adjunto’ ou ‘titular’;
o nroTurmas deve ser maior ou igual a 0.

Exemplo: criação da tabela Professores

create table Professores (


matricula int,
nome varchar(40) not null,
RG numeric(10) unique,
sexo char(1) check(sexo in ('M','F')),
idade tinyint check(idade between 21 and 80),
titulacao varchar(15) check(titulacao in
('graduado','especialista', 'mestre', 'doutor')),
categoria varchar(15) check(categoria in
('auxiliar','assistente', 'adjunto', 'titular')),
nroTurmas tinyint check(nroTurmas >= 0),
constraint pkProf primary key (matricula) )

• Cursos(código, nome, duração, coordenador)


o código é chave primária;
o nome é um atributo obrigatório;
o duração deve estar entre 4 e 12 (é o número de fases);
o coordenador é uma chave estrangeira para Professores. (defina da
seguinte maneira: constraint fkProf foreign key (coordenador)
references Professores on update cascade)

• Disciplinas(código, nome, créditos)


o código é chave primária;
o nome é um atributo obrigatório;
o créditos deve estar entre 2 e 8.
• Currículos(curso, disciplina, fase)
o o par (curso, disciplina) é chave primária;
o curso é uma chave estrangeira para Cursos (defina update e delete
em cascata);
o disciplina é uma chave estrangeira para Disciplinas (defina update e
delete em cascata);
o fase deve entre 1 e 12.

• Turmas(disciplina, código, vagas, professor)


o o par (disciplina, código) é chave primária;
o disciplina é uma chave estrangeira para Disciplinas (defina update e
delete em cascata);
o vagas deve ser maior que zero;
o professor é uma chave estrangeira obrigatória para Professores
(defina update em cascata).

2) Defina e teste as seguintes restrições de integridade no BD:

2.1) Toda vez que uma turma for incluída, incrementar o número de turmas do
respectivo professor;

Exemplo de definição de Trigger:

create trigger IncTurmasProf on Turmas


after insert
as
update Professores
set nroTurmas = nroTurmas + 1
where exists ( select professor
from inserted
where Professores.matricula = professor)

Observação: as tabelas predefinidas inserted e deleted mantêm os dados


que foram inseridos ou removidos do BD, respectivamente.

2.2) Garanta agora o contrário: toda vez que uma turma for excluída,
decrementar o número de turmas do respectivo professor;

2.3) A fase na qual uma disciplina é oferecida em um curso não pode ser maior
que a duração do curso. Em caso de violação, desfaça a transação;

Definição:

create trigger FaseInvalida on Curriculos


after insert, update
as
if exists (select *
from Cursos C join inserted Curr
on C.codigo = Curr.curso
where C.duracao < Curr.fase)
begin
print 'Fase Invalida!'
rollback transaction
end
2.4) Se um professor possui:
i. titulação doutor, sua categoria só pode ser adjunto ou titular;
ii. titulação mestre, sua categoria só pode ser assistente;
iii. titulação graduado ou especialista, sua categoria só pode ser
auxiliar.

Dica: teste todas as situações que violam a integridade (através de um if


exists) e desfaça a transação caso elas ocorram.

2.5) Quando um professor for removido do BD e ele for um coordenador de


curso, atribuir NULL ao atributo coordenador deste curso;

Sugestão: defina um trigger do tipo instead of (veja a sintaxe do create trigger).


Este tipo de trigger executa o que está implementado no corpo do trigger ao invés
de executar a atualização. No corpo do trigger: atribua inicialmente NULL ao
atributo coordenador e depois repita a exclusão do professor (reexecute o delete).
Neste caso, um trigger do tipo after não pode ser definido, pois haveria violação de
chave estrangeira em Cursos após a remoção.

2.6) (RI de ativação automática) todo dia 31 do mês de dezembro incrementar


a idade de professores (se idade < 80). Definir uma stored procedure que
implemente esta RI.