Triggers em SQL
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:
Fiz da seguinte forma este trigger:
(a)
(b)
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.
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
Curtidas 0
Respostas
Daniel
05/12/2019
Olá, tive uma evolução.
O trigger, por exemplo 1a, é executado sem erros:
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?
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?
GOSTEI 0
Emerson Nascimento
05/12/2019
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.
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
GOSTEI 0
Daniel
05/12/2019
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.
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
GOSTEI 0