Triggers em SQL

05/12/2019

0

Olá a todos,

estou fazendo um trabalho de BD para a faculdade e estou com dificuldades em fazer dois triggers funcionar. Não é nada complicado, mas não sei se estou errando na sintaxe ou na própria query. Se alguém puder me ajudar, agradeço.

1. Trigger 1

É um banco de dados para uma clínica médica. Preciso garantir que (a) uma recepcionista ou uma enfermeira não seja simultaneamente um médico e (b) um médico não seja simultaneamente um médico trainee ou qualquer outro funcionário.

As tabelas pertinentes são:
empregado (id, nome) 
enfermeira(id) // id é chave estrangeira que referencia id empregado
recepcionista (id) //id é chave estrangeira que referencia id empregado
medico_permanente (id) //id é chave estrangeira que referencia id empregado
medico_trainee (id) //id é chave estrangeira que referencia id empregado 


Fiz da seguinte forma este trigger:

(a)
CREATE TRIGGER verifica_EnfermeiraRecepcionista ON medico_permanente
FOR INSERT, UPDATE
AS
BEGIN 
IF (NEW.id = enfermeira.id) OR (NEW.id = recepcionista.id) THEN
RAISERROR ('Esta é uma enfermeira ou recepcionista, não um médico!');
RETURN
END 


(b)

CREATE TRIGGER verifica_MedicoPermanente ON medico_trainee, enfermeira, recepcionista
FOR INSERT, UPDATE
AS
BEGIN
IF (NEW.id= medico_trainee.id) OR (NEW.id= enfermeira.id) OR (NEW.id = recepcionista.id) THEN
RAISERROR ('Este é um médico permanente!');
RETURN;
END


2. Trigger 2

Triggers para assegurar que diferentes indivíduos (médicos ou clientes) não tenham o mesmo número de telefone.

As tabelas pertinentes são:

client (id, nome)
numero_fone_cliente (id, telefone) // id é chave estrangeira que referencia id da tabela client
numero_fone_empregado (id, telefone) // id é chave estrangeira que referencia id da tabela empregado

Fiz da seguinte forma os dois triggers:

CREATE TRIGGER fone_valido_cliente ON numero_fone_cliente
FOR INSERT, UPDATE
AS
BEGIN
IF ( EXISTS ( SELECT id FROM numero_fone_empregado WHERE fone = NEW.fone)) THEN
RAISERROR (O telefone já existe. Digite outro.');
RETURN;
END

CREATE TRIGGER fone_valido_empregado ON numero_fone_empregado
FOR INSERT, UPDATE
AS
BEGIN
IF ( EXISTS ( SELECT id FROM numero_fone_cliente WHERE fone = NEW.fone))
RAISERROR ('O telefone já existe. Digite outro!');
RETURN;
END

Se alguém tiver alguma dica agradeço.
Daniel

Daniel

Responder

Posts

06/12/2019

Daniel

Olá, tive uma evolução.

O trigger, por exemplo 1a, é executado sem erros:

delimiter //

CREATE TRIGGER verifica_EnfermeiraRecepcionista BEFORE INSERT ON medico_permanente 
FOR EACH ROW
BEGIN
IF (NEW.id= enfermeira.id OR NEW.id= recepcionista.id) THEN 
SET NEW='Esta é uma enfermeira ou recepcionista!';
END IF; 
END//


Mas quando tento testá-lo inserindo algum valor na tabela medico_permanente, o sql me retorna com o erro "unknown table enfermeira in field list".

Alguém tem alguma dica?
Responder

06/12/2019

Emerson Nascimento

ao executar o TRIGGER, você está manipulando somente com a tabela do trigger (com NEW e/ou OLD).
para fazer o que você pretende, você precisa buscar o conteúdo nas tabelas auxiliares.
CREATE TRIGGER verifica_EnfermeiraRecepcionista BEFORE INSERT ON medico_permanente 
FOR EACH ROW
BEGIN
    IF (exists(select e.id from enfermeira e where e.id = NEW.id) OR exists(select r.id from recepcionista r where r.id = NEW.id)) THEN
        RAISERROR ('Esta é uma enfermeira ou recepcionista!');
    END IF; 
END
Responder

06/12/2019

Daniel

Obrigado Emerson. Apliquei o que citou e funcionou perfeitamente!

ao executar o TRIGGER, você está manipulando somente com a tabela do trigger (com NEW e/ou OLD).
para fazer o que você pretende, você precisa buscar o conteúdo nas tabelas auxiliares.
CREATE TRIGGER verifica_EnfermeiraRecepcionista BEFORE INSERT ON medico_permanente 
FOR EACH ROW
BEGIN
    IF (exists(select e.id from enfermeira e where e.id = NEW.id) OR exists(select r.id from recepcionista r where r.id = NEW.id)) THEN
        RAISERROR ('Esta é uma enfermeira ou recepcionista!');
    END IF; 
END
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar