Ir para conteúdo
MauVirtual

Usar Trigger? Procedure? Ambas?

Recommended Posts

Pessoal, estou perdido tenho a seguinte tarefa abaixo, mas usando a trigger não posso dar o select ela nao aceita, e não sei se uso procedure, triger, ambas, sei que essa parte deveria ser feito pela aplicação, mas o professor quer essa apresentação somente em BD.

compare se a data e hora da viagem e o motorista e viatura estão disponíveis antes de incluir no banco de dados,

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á disponivel em um intervalo de dia e hora, pois poderam acontecer viagens de mais de um dia.

Abaixo segue meu código sou bem iniciante e toda ajuda seria muito bem vinda.

Já criei um posto sobre isso, mas mudei a tabela e naquele post não consegui resolver

agredeço a ajuda, batendo o desespero já

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;

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por gmadeira
      Boa tarde,
       
      Tenho a seguinte tabela:
       
      CREATE TABLE prodvdedor (
      codPrdvdor int(10) NOT NULL AUTO_INCREMENT,
      codVendedor int(11) NOT NULL,
      codTecido int(11) NOT NULL,
      codCor int(11) NOT NULL,
      medida decimal(10,2) DEFAULT NULL,
      stockMedidas decimal(10,2) DEFAULT NULL,
      peso decimal(10,4) DEFAULT NULL,
      stockPeso decimal(10,4) DEFAULT NULL,
      dataCompra date NOT NULL,
      valor decimal(10,2) NOT NULL,
      PRIMARY KEY (codPrdvdor),
      KEY PK_prodvdedor_vendededor_idx (codVendedor),
      KEY Pk_prodvdedor_tecidos_idx (codTecido),
      KEY Pk_prodvdedor_cores_idx (codCor),
      CONSTRAINT Pk_prodvdedor_cores FOREIGN KEY (codCor) REFERENCES cores (codCor) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT Pk_prodvdedor_tecidos FOREIGN KEY (codTecido) REFERENCES tecidos (codTecido) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT PK_prodvdedor_vendedores FOREIGN KEY (codVendedor) REFERENCES vendedores(codVendedor) ON DELETE CASCADE ON UPDATE CASCADE
      ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;Pciso criar uma trigger 
       
      preciso criar uma trigger para atualizar os campos stockMedidas e stockPeso, quando digito os dados ela procura se tem outra informação com os campos pedidos e atualiza, fiz da seguinte maneira:
       
      CREATE DEFINER=`root`@`localhost` TRIGGER `bailledados`.`trg_AtualizarProdVendor` BEFORE INSERT ON `prodvdedor` FOR EACH ROW BEGIN SET @stockAntigo = (SELECT stockMedidas FROM prodvdedor WHERE codVendedor=new.codVendedor and codTecido=new.codTecido and codCor=new.codCor); UPDATE prodvdedor SET stockMedidas=@stockAntigo+new.medida WHERE codVendedor=new.codVendedor and codTecido=new.codTecido and codCor=new.codCor; SET @stockAntigo1 = (SELECT stockPeso FROM prodvdedor WHERE codVendedor=new.codVendedor and codTecido=new.codTecido and codCor=new.codCor); UPDATE prodvdedor SET stockPeso=@stockAntigo1+new.peso WHERE codVendedor=new.codVendedor and codTecido=new.codTecido and codCor=new.codCor; SET @valorAntigo = (SELECT valor FROM prodvdedor WHERE codVendedor=new.codVendedor and codTecido=new.codTecido and codCor=new.codCor); UPDATE prodvdedor SET valor=@valorAntigo1+new.valor WHERE codVendedor=new.codVendedor and codTecido=new.codTecido and codCor=new.codCor; END  Só que não funciona da erro:
       
      insert 
          into
              bailledados.prodvdedor
              (codCor, codTecido, codVendedor, medida, stockMedidas, peso, stockPeso, dataCompra, valor) 
          values
              (?, ?, ?, ?, ?, ?, ?, ?, ?)
      WARN:   SQL Error: 1442, SQLState: HY000
      ERROR:   Can't update table 'prodvdedor' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
      Informações:   could not execute statement
    • Por R_natinho
      Aonde eu consigo ver os dados de conexão como senha, usuario e porta no meu SGBD?
    • Por dieglus
      Olá! Tenho que fazer um projeto que é um SGBD em C, e uma das funções é para criar uma tabela da seguinte forma:
       
      1. Criar um tabela
           a. os tipos de dados para as colunas poderão ser os tipos primitivos em C ( char, int, float e double) e strings
           b. os valores deverão ser armazenados em arquivo
           c. na criação da tabela deverá ser solicitado um nome de coluna para ser a chave primária
                i. a chave primária deverá ser obrigatoriamente do tipo inteiro sem sinal
       
      Alguém pode me dar uma dica da lógica dessa função? Por favor, alguém me ajude!!!
    • Por Leandro de Jesus
      Senhores muito boa noite,
       
      Eu tenho o seguinte funcionando:
       
      IF(OLD.idDepartamentos <> NEW.idDepartamentos) THEN INSERT INTO px_pedidos_log (idPedido, campo, valor_novo, valor_antigo ) values (NEW.id, 'idDepartamentos', NEW.idDepartamentos, OLD.idDepartamentos ); END IF  
      Eu queria fazer isso com mais campos na mesma trigger.
      Tentei abaixo e dá erro.
      Alguma luz para fazer isso ?

      Preciso fazer isso com 6 campos.
       
      IF(OLD.idDepartamentos <> NEW.idDepartamentos) THEN INSERT INTO px_pedidos_log (idPedido, campo, valor_novo, valor_antigo ) values (NEW.id, 'idDepartamentos', NEW.idDepartamentos, OLD.idDepartamentos ); END IF; IF(OLD.idAcao <> NEW.idAcao) THEN INSERT INTO px_pedidos_log (idPedido, campo, valor_novo, valor_antigo ) values (NEW.id, 'idAcao', NEW.idAcao, OLD.idAcao ); END IF;  
       
    • Por Leandro de Jesus
      Senhores muito boa tarde,
      Preciso de uma luz.
       
       
      Depois de executar o trigger
      Preciso comparar os campos de duas tabelas
       
      Então após atualizar a tabela px_pedidos eu pego os dados e coloco px_pedidos_log e depois preciso comparar os campos
      O código abaixo funciona, só não consigo comparar.
       
      DROP TRIGGER IF EXISTS `LogPedido`; CREATE DEFINER=`root`@`localhost` TRIGGER `LogPedido` BEFORE UPDATE ON `px_pedidos` FOR EACH ROW insert into px_pedidos_log select * from px_pedidos WHERE id=NEW.id  
      Logo após tentei  e não foi 

       
      IF(NEW.campo != OLD.campo) THEN         UPDATE px_pedidos SET alteracoes +=1 WHERE id=NEW.id; END IF;  
      Alguém pode me dar um caminho ? Já rodei a internet mas não estou conseguindo implantar isso.
       
      Abs e obrigado
       
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.