Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal, preciso d uma luz, estou criando um sistema de agendamento de viagens de viaturas, e preciso que antes de incluir uma nova viagem, seja conferido se a data e hora inicio da viagem e a data e hora final da viagem já não foram ocupadas, usando essa viatura que está como FK e esse motorista que está como FK .
Ou seja preciso que antes que a viagens seja incluida, saber se aquela viatura E o motorista E a data e hora está disponíveis.
>
Em 07/05/2018 at 13:20, Motta disse:
São duas coisas , as FKS garantem que a Viatura e o Motorista estejam cadastrados.
Quanto a intervalo veja se istoajuda.
Olá amigo, sou muito iniciante estou tentando criar essa trigger para o BD mesmo sabendo que seria melhors que a apalicação fizesse isso, pois preciso apresentar o trabalho baseado somente em BD
sei que o codigo abaixo nao está funcionando e não faço ideia de como fazer
CREATE TRIGGER CONTROLE_DE_VIAGENS
AFTER INSERT ON VIAGENS
FOR EACH ROW
BEGIN
IF
SELECT * FROM viagens
INNER JOIN MOTORISTA ON ID_MOTORISTA = IDMOTORISTA
INNER JOIN VIATURA ON ID_VIATURA = IDVIATURA
WHERE (IDMOTORISTA = ID_MOTORISTA OR IDVIATURA = ID_VIATURA)
AND NOT (DATAHORAINICIO > DATAHORAFINAL)
AND NOT (DATAHORAFINAL < DATAHORAINICIO)
ELSE
INSERT INTO VIAGENS VALUES(NULL, NEW.CIDADE,NEW.DATAHORAINICIO, NEW.DATAHORAFINAL,NEW.COR,
NEW.CEP,NEW.RUA,NEW.NUMERO,NEW.BAIRRO,NEW.ESTADO,NEW.DESCRICAO, NEW.ID_DADOSPESSOAS, NEW.ID_MOTORISTA,
NEW.ID_VIATURA);
END IF;
END
$A trigger insere na MESMA tabela alvo.
O que você pretendia fazer ?
Olá esse é o meu coódigo estou tentando criar uma trigger que compare se a data e hora da viagem e o motorista e viatura estão disponiveis antes de incluir no banco de dados, sei que deveria ser feito pela aplicação mais meu trabalho é só sobre BD de dados preciso por essa regra nele. Entao digamos que a viatura Gol tem uma viagem com o motorista Carlos dia 22/03/2018 as 11:00 com termino no mesmo dia porem na hora 17:00 e suponhamos que alguem quera cadastra a viagem com o mesmo motorista a mesma viatura no mesmo dia porem no horario do 12:00, não poderia ser cadastrado já que a viatura e motorista estariam ocupados. Estão preci ser checado se a viatura está disponivel, se o motorista está desponivel em um intervalo de dia e hora, pois podemram acontecer viagens de mais de um dia.
Abaixo segue meu código sou bem iniciante e toda ajuda seria muito bem vinda.
CREATE TABLE DADOSPESSOAS(
IDDADOSPESSOAS INT PRIMARY KEY AUTO_INCREMENT,
NOME VARCHAR(45) NOT NULL,
EMAIL VARCHAR(45) UNIQUE NOT NULL,
NIVEL CHAR(1) NOT NULL,
DATANASCIMENTO DATE NOT NULL,
SEXO CHAR(1) NOT NULL,
CPF CHAR(14) UNIQUE NOT NULL,
CELULAR VARCHAR(14) UNIQUE NOT NULL,
CEP CHAR (9) NOT NULL,
RUA VARCHAR(30) NOT NULL,
NUMERO VARCHAR(8) NOT NULL,
BAIRRO VARCHAR(25) NOT NULL,
CIDADE VARCHAR(40) NOT NULL,
ESTADO CHAR(2) NOT NULL
);
CREATE TABLE MOTORISTA (
IDMOTORISTA INT PRIMARY KEY AUTO_INCREMENT,
NUMEROREGISTRO VARCHAR(10) UNIQUE NOT NULL,
VALIDADE DATE NOT NULL,
ID_DADOSPESSOAS INT
);
CREATE TABLE ADMIN(
IDADMIN INT PRIMARY KEY AUTO_INCREMENT,
SENHA VARCHAR(12) NOT NULL,
ID_DADOSPESSOAS INT
);
CREATE TABLE VIATURA (
IDVIATURA INT PRIMARY KEY AUTO_INCREMENT,
TIPOVEICULO VARCHAR(45) NOT NULL,
MARCA VARCHAR(25) NOT NULL,
MODELO VARCHAR(25) NOT NULL,
COR VARCHAR(25) NOT NULL,
ANOFABRICACAO CHAR(4) NOT NULL,
PLACA CHAR(8) UNIQUE NOT NULL,
RENAVAN CHAR(11) UNIQUE NOT NULL,
PASSAGEIROS CHAR(2) NOT NULL
);
CREATE TABLE VIAGENS (
IDVIAGENS INT PRIMARY KEY AUTO_INCREMENT,
CIDADE VARCHAR(25) NOT NULL,
DATAHORAINICIO DATETIME NOT NULL,
DATAHORAFINAL DATETIME NOT NULL,
COR VARCHAR(15) NOT NULL,
CEP CHAR(9) NOT NULL,
RUA VARCHAR(30) NOT NULL,
NUMERO VARCHAR(8) NOT NULL,
BAIRRO VARCHAR(25) NOT NULL,
ESTADO CHAR(2) NOT NULL,
DESCRICAO VARCHAR(200),
ID_DADOSPESSOAS INT,
ID_MOTORISTA INT,
ID_VIATURA INT
);
CREATE TABLE PASSAGEIRO (
IDPASSAGEIRO INT PRIMARY KEY AUTO_INCREMENT,
ID_DADOSPESSOAS INT ,
ID_VIAGEM INT
);
ALTER TABLE VIAGENS
ADD CONSTRAINT FK_DADOSPESSOAS_VIAGENS
FOREIGN KEY (ID_DADOSPESSOAS)
REFERENCES DADOSPESSOAS(IDDADOSPESSOAS) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE VIAGENS
ADD CONSTRAINT FK_MOTORISTA_VIAGENS
FOREIGN KEY (ID_MOTORISTA)
REFERENCES MOTORISTA(IDMOTORISTA)ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE VIAGENS
ADD CONSTRAINT FK_VIATURA_VIAGENS
FOREIGN KEY (ID_VIATURA)
REFERENCES VIATURA(IDVIATURA)ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE MOTORISTA
ADD CONSTRAINT FK_DADOSPESSOAS_MOTORISTA
FOREIGN KEY (ID_DADOSPESSOAS)
REFERENCES DADOSPESSOAS(IDDADOSPESSOAS)ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE ADMIN
ADD CONSTRAINT FK_DADOSPESSOAS_ADMIN
FOREIGN KEY (ID_DADOSPESSOAS)
REFERENCES DADOSPESSOAS(IDDADOSPESSOAS)ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE PASSAGEIRO
ADD CONSTRAINT FK_DADOSPESSOAS_PASSAGEIRO
FOREIGN KEY (ID_DADOSPESSOAS)
REFERENCES DADOSPESSOAS (IDDADOSPESSOAS)ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE PASSAGEIRO
ADD CONSTRAINT FK_VIAGENS_PASSAGEIRO
FOREIGN KEY (ID_VIAGEM)
REFERENCES VIAGENS (IDVIAGENS)ON DELETE CASCADE ON UPDATE CASCADE;
/ AQUI ESTÁ MEU PROBLEMA, NÃO CONSIGO RESOLVER ESSA TRIGGER /
CREATE TRIGGER CONTROLE_DE_VIAGENS
AFTER INSERT ON VIAGENS
FOR EACH ROW
BEGIN
IF
SELECT * FROM viagens
INNER JOIN MOTORISTA ON VIAGENS.ID_MOTORISTA = MOTORISTA.IDMOTORISTA
INNER JOIN VIATURA ON VIAGENS.ID_VIATURA = VIATURA.IDVIATURA
WHERE (MOTORISTA.IDMOTORISTA = VIAGENS.ID_MOTORISTA OR VIATURA.IDVIATURA = VIAGENS.ID_VIATURA)
AND NOT (DATAHORAINICIO > DATAHORAFINAL)
AND NOT (DATAHORAFINAL < DATAHORAINICIO)
ELSE
INSERT INTO VIAGENS VALUES(NULL, NEW.CIDADE,NEW.DATAHORAINICIO, NEW.DATAHORAFINAL,NEW.COR,
NEW.CEP,NEW.RUA,NEW.NUMERO,NEW.BAIRRO,NEW.ESTADO,NEW.DESCRICAO, NEW.ID_DADOSPESSOAS, NEW.ID_MOTORISTA,
NEW.ID_VIATURA);
END IF;
END
$uma tirgger é um objeto que reage a uma operação no banco e dispara um processo.
Neste caso seria melhor fazer uma PROCEDURE que testaria a condição "se a data e hora da viagem e o motorista e viatura estão disponiveis antes de incluir no banco de dados," , tente fazer esta Procedure.
Motta muito obrigado, vou tentar estudar procedure para ver como posso fazer
São duas coisas , as FKS garantem que a Viatura e o Motorista estejam cadastrados.
Quanto a intervalo veja se istoajuda.