Ir para conteúdo
Fórum Script Brasil
  • 0

Dúvida na criação de Triggers


felipebath

Pergunta

Bom dia!

Estou com dúvidas na criação de triggers... sou iniciante

Afinal, por que usar FK's se posso usar apenas triggers para "linkar" duas tabelas? Estes conceitos ainda não estao muito claros para mim, por mais que eu tenha lido sobre o assunto...

Tenho as seguintes tabelas:

disciplina (

id_disciplina(pk), nome)

turma (

id_turma(pk), matricula, id_disciplina)

id_disciplina(fk) reference disciplina (id_disciplina)

matricula(fk) REFERENCES aluno (matricula),

aluno (

matricula(pk), nome)

boletim (

matricula(pk), id_disciplina, id_turma, v1, v2 e etc.)

matricula(fk) REFERENCES turma (matricula) on delete cascade,

id_disciplina(fk) REFERENCES disciplina (id_disciplina) on delete cascade,

id_turma(fk) REFERENCES turma (id_turma) on delete cascade,

tentei criar estes triggers, mas deu erro de sintaxe na linha 3... o que pode estar acontecendo?

CREATE TRIGGER add_matricula_turma AFTER INSERT ON aluno
FOR EACH ROW BEGIN
INSERT INTO turma (matricula) values ('20002000');
END;

CREATE TRIGGER add_matricula_boletim AFTER INSERT ON aluno
FOR EACH ROW BEGIN
INSERT INTO boletim (matricula) VALUES ('20002000');
END;

Grato.

Editado por felipebath
Link para o comentário
Compartilhar em outros sites

12 respostass a esta questão

Posts Recomendados

  • 0

Oi, Felipe

está na hora de você procurar e baixar alguns tutoriais sobre SQl.

Triggers são uma coisa e CONSTRAINTS são outra.

Trigges seguem regras que estão muito bem documentadas no manual do MySQL de sua Versão.

No seu caso basta uma trigger AFTER INSERT ON aluno. Se tentar colocar mais de um trigger com esta referência para esta tabela, você obterá erro.

Outra coisa. a não ser que você queira colocar explicitamente um valor fixo em uma tabela, aprenda a trabalhar com OLD e NEW, operadores que informam se irão utilizar os valores novos (os que estão sendo gravados na tabela) ou se vão usar os valores antigos (os que já estavam gravados na tabela).

Link para o comentário
Compartilhar em outros sites

  • 0

Oi Denis,

só para eu ter uma idéia: se quisesse

AO INSERIR UMA deteminada MATRICULA NA TABELA ALUNO

QUE

TABELA TURMA RECEBA esta MATRICULA NO CAMPO MATRICULA

E TABELA BOLETIM TAMBEM RECEBA esta MATRICULA NO CAMPO MATRICULA

como ficaria a sintaxe disto?

Denis, acha que no meu caso não preciso de constraints? acha que basta a criacao de triggers???

muito obrigado pela atencao.

Link para o comentário
Compartilhar em outros sites

  • 0
Oi Denis,

só para eu ter uma idéia: se quisesse AO INSERIR UMA deteminada MATRICULA NA TABELA ALUNO QUE

TABELA TURMA RECEBA esta MATRICULA NO CAMPO MATRICULA E TABELA BOLETIM TAMBEM RECEBA esta MATRICULA NO CAMPO MATRICULA

como ficaria a sintaxe disto?

Ficaria parecido com o exemplo abaixo:

CREATE TRIGGER add_matricula_turma AFTER INSERT ON aluno
FOR EACH ROW BEGIN
INSERT INTO turma (matricula) values (NEW.matricula);
INSERT INTO boletim (matricula) VALUES (new.matricula);
END;

Não tente fazer pois vai dar erro de constraint.

Denis, acha que no meu caso não preciso de constraints? acha que basta a criacao de triggers???

muito obrigado pela atencao.

Sempre é necessário usar constraints se você quer um modelo de dados que funcione e respeite as regras do seu negócio. O uso de triggers serve,também para reforçar uma regra de negócio. ou seja para ser usado como uma constraint. Por exemplo, imagine uma regra de negócio em que um nome fosse obrigatório. você poderia criar uma trigger do tipo BEFORE INSERT para verificar se o campo nome foi preenchido e, se não foi, rejeitar a gravação do registro.
Link para o comentário
Compartilhar em outros sites

  • 0

Denis,

Li alguma coisa parecida com o que disse sobre as constraints:

...
SET @senha = NEW.senha_usuario;
-- validando campo
IF( @senha = '' ) THEN
SET NEW.senha_usuario = NULL;
END IF;
então, fiz assim p efeitos de teste:
DELIMITER //
CREATE TRIGGER add_matricula_turma AFTER INSERT ON aluno
FOR EACH ROW BEGIN
INSERT INTO turma (matricula) values (NEW.matricula);
INSERT INTO boletim (matricula) VALUES (new.matricula);
END;
//

erro: #1227 - Access denied; you need the SUPER privilege for this operation

Por que disse que daria erro de constraint?

Grato.

Link para o comentário
Compartilhar em outros sites

  • 0

Você está usando o usuário root?

Porque se não for você deverá dar privilégios de SUPER ao usuário que está utilizando.

Se está você está usando o usuário na máquina servidora?

Porque se não for você terá que dar privilégios de SUPER ao usuário e a estação.

Veja mais sobre privilégios no manual do MySQL de sua versão.

Link para o comentário
Compartilhar em outros sites

  • 0
É um banco hospedado na Hosnet...

vou entrar em contato com o suporte para ver isso...

servidores locais não suportam tabela InnoDb, não é??

grato.

Suportam, sim. O meu banco de teste está instalado em minha máquina.

Link para o comentário
Compartilhar em outros sites

  • 0
É um banco hospedado na Hosnet...

vou entrar em contato com o suporte para ver isso...

servidores locais não suportam tabela InnoDb, não é??

grato.

Suportam, sim. O meu banco de teste está instalado em minha máquina.

Sei que não esta relacionado ao tópico, mas no meu servidor local por mais que eu defina ENGINE=Innodb, a tabela fica MyIsam e não há opcao de InnoDb na parte grafica do phpmyadmin 2.11.3 e MySQL: 5.0.51 que eu uso...

estou tentando falar com o suporte da minha hospedagem mas tah dificil... vamos ver...

grato.

Editado por felipebath
Link para o comentário
Compartilhar em outros sites

  • 0
Sei que não esta relacionado ao tópico, mas no meu servidor local por mais que eu defina ENGINE=Innodb, a tabela fica MyIsam e não há opcao de InnoDb na parte grafica do phpmyadmin 2.11.3 e MySQL: 5.0.51 que eu uso...

estou tentando falar com o suporte da minha hospedagem mas tah dificil... vamos ver...

grato.

Isto acontece porque definiram que o servidor seria somente MyISAM. É muito mais fácil gerenciar um servidor MyISAM do que um InnoDB.

Link para o comentário
Compartilhar em outros sites

  • 0

Bem, meu provedor me pediu um prazo até o meio do ano para fazer as alteracoes nas permissoes, é mole? não sei o que fazer...

há meios de eu continuar com o desenvolvimento localmente?

Uso:

ApacheFriends XAMPP (basic package) version 1.6.5 ######

+ Apache 2.2.6

+ MySQL 5.0.51

+ PHP 5.2.5 + PHP 4.4.7 + PEAR

+ PHP-Switch win32 1.0 (please use the "php-switch.bat")

+ XAMPP Control Version 2.5 from www.nat32.com

+ XAMPP Security 1.0

+ SQLite 2.8.15

+ OpenSSL 0.9.8g

+ phpMyAdmin 2.11.3

windows xp professional sp2...

grato.

Editado por felipebath
Link para o comentário
Compartilhar em outros sites

  • 0

Oi, 'felipebath'

Eu desenvolvo todos os meus sistemas em meu notebook (local).

Uso MS Windows XP

MySQL 5.0.37

Java

Delphi

Creio que não haja problemas em desenvolver seu sistema localmente. Vou transferir este tópico para a seção de PHP para que o pessoal de lá possa te ajudar nesta configuração.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...