Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Guilherme_90

[Resolvido] Store Procedure ou Trigger

Recommended Posts

Boa noite pessoal (ou boa madruada) hehehe!

Seguinte, estou aqui quebrando cabeça pois começei a brincar com Procedures e Trigger (sim, chegou o momento certo de usá-las). Nesta brincadeira toda, obviamente estou tendo alguns problemas, codificamente falando.

 

Preciso resolver o seguinte problema: Tenho uma tabela n -> n com seus respectivos FK's, certo? Só que, eu não posso deixar que o usuário possa remove-lo, pois seu ID está sendo relacionado na tabela de n -> n, correto?

 

Pensei em criar uma Trigger para isso, mas não irá resolver meu problema, pois não é possível fazer seleção dos registros. Pois bem, a solução são as Procedures, só que to batendo cabeça com isso e não consigo chegar na solução. O que preciso fazer é o seguinte: Selecionar idTabela1, idTabela3, fazer suas respectivas comparações de valores, e por último uma condicional, é basicamente isso de forma resumida.

 

Se não for muito isso, qual seria a melhor solução?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Também acho que uma integridade relacional funcionaria melhor do que Triggers ou Procedures...

 

De qualquer forma, a SP não vai impedir que um registro seja excluido acidentalmente, uma CONSTRAINT ou uma TRIGGER (usando uma técnica de "chave duplicada"), sim.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Trigger é melhor numa situação do tipo :

 

Um PEDIDO que tenha ITEM_DE_PEDIDO numa situação de enviado não pode ser deletado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta e Prog

Sim, mas sempre que faço a modelagem do meu banco no MySQL Workbench, quando vou inserir o código SQL dá mensagem de erro referente as minhas FK's. Sou obrigado a colocar valores das ACTIONS (ON UPDATE, ON DELETE, RESTRICT, SET NULL) ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não. Eu quero que não seja possível remover um registro da FK, entendeu? Olha o que eu fiz:

 

CREATE  TABLE IF NOT EXISTS `consultar`.`schedules` (
 `idschedules` INT NOT NULL AUTO_INCREMENT ,
 `idPacient` INT NOT NULL ,
 `idDoctor` INT UNSIGNED NOT NULL ,
 `day` DATE NOT NULL ,
 `hour` TIME NOT NULL ,
 `typeScheduling` INT(1) NOT NULL COMMENT 'Tipo de Agendamento\\n0 - Consulta;\\n1 - Exame\\n2 - Revisão' ,
 `status` INT(1) NOT NULL DEFAULT 0 COMMENT 'Status da Consulta: \\n0 - Marcada; \\n1 - Desmarcada' ,
 PRIMARY KEY (`idschedules`, `idPacient`, `idDoctor`) ,
 INDEX `fk_schedules_pacients_idx` (`idPacient` ASC) ,
 INDEX `fk_schedules_users1_idx` (`idDoctor` ASC) ,
 CONSTRAINT `fk_schedules_pacients`
   FOREIGN KEY (`idPacient` )
   REFERENCES `consultar`.`pacients` (`idPacient` )
   ON DELETE RESTRICT
   ON UPDATE CASCADE,
 CONSTRAINT `fk_schedules_users1`
   FOREIGN KEY (`idDoctor` )
   REFERENCES `consultar`.`users` (`idDoctor` )
   ON DELETE RESTRICT
   ON UPDATE CASCADE)
ENGINE = InnoDB

Nisso, sempre gera o erro:

#1005 - Can't create table 'consultar.schedules' (errno: 150)

O que faço?

Compartilhar este post


Link para o post
Compartilhar em outros sites

...
 `idPacient` INT NOT NULL ,
 `idDoctor` INT UNSIGNED NOT NULL ,
...

 

idPacient e idDoctor em suas tabelas de origem são iguais?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Escrevi o SQL errado, ao invez de ser tabela doctors, é a tabela users, mas já arrumei este erro.

Mas respondendo a sua pergunta: Sim, na tabela users tem o idUser e a mesma coisa na tabela pacients.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você tem certeza absoluta que na sua tabela Pacients a coluna idPacient esta como INT NOT NULL?

e

Você tem certeza absoluta que na sua tabela Doctors a coluna idDoctor esta como INT UNSIGNED NOT NULL?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você tem certeza absoluta que na sua tabela Pacients a coluna idPacient esta como INT NOT NULL?

e

Você tem certeza absoluta que na sua tabela Doctors a coluna idDoctor esta como INT UNSIGNED NOT NULL?

Agora deu certo. Acontece que nas minhas duas tabelas estavam SIM com INT UNSIGNED NOT NULL, porém na minha segunda FK (idUser) estava sem UNSIGNED, impedindo de criar a tabela, agora veja como ficou:

 

CREATE  TABLE IF NOT EXISTS `consultar`.`schedules` (
 `idschedules` INT NOT NULL AUTO_INCREMENT ,
 `idUser` INT UNSIGNED NOT NULL ,
 `idPacient` INT UNSIGNED NOT NULL ,
 `day` DATE NOT NULL ,
 `hour` TIME NOT NULL ,
 `typeScheduling` INT(1) NOT NULL COMMENT 'Tipo de Agendamento\\n0 - Consulta;\\n1 - Exame\\n2 - Revisão' ,
 `status` INT(1) NOT NULL DEFAULT 0 COMMENT 'Status da Consulta: \\n0 - Marcada; \\n1 - Desmarcada' ,
 PRIMARY KEY (`idschedules`) ,
 INDEX `fk_schedules_users_idx` (`idUser` ASC) ,
 INDEX `fk_schedules_pacients1_idx` (`idPacient` ASC) ,
 CONSTRAINT `fk_schedules_users`
   FOREIGN KEY (`idUser` )
   REFERENCES `consultar`.`users` (`idUser` )
   ON DELETE RESTRICT
   ON UPDATE CASCADE,
 CONSTRAINT `fk_schedules_pacients1`
   FOREIGN KEY (`idPacient` )
   REFERENCES `consultar`.`pacients` (`idPacient` )
   ON DELETE RESTRICT
   ON UPDATE CASCADE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci
COMMENT = 'Tabela de agendamentos para consultas / exames.'

Agora o que preciso fazer é tratar o erro na aplicação na hora de remover algum paciente / usuário.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora o que preciso fazer é tratar o erro na aplicação na hora de remover algum paciente / usuário.

 

:thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigado a todos por me ajudarem.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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