Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

diokhan

triggers sql [RESOLVIDO]

Mensagens Recomendadas

diokhan

boas,

eu no meu trabalho preciso de utilizar trigger, nunca utilizei antes, tive a estudar com uns tutoriais e a ler informações na Internet sobre trigger, fiz mas ao correr para experimentar não funcionou como deveria. alguém pode ajudar-me a perceber o que fiz de errado?

delimiter ;;

CREATE TRIGGER insertTrigger BEFORE INSERT ON BLAST
    FOR EACH ROW
        INSERT INTO BLAST_INDEX SET ID_BLAST_INDEX = NEW.ID_BLAST AND HIT_DESCRIPTION_INDEX = NEW.HIT_DESCRIPTION AND BLAST_EVALUE_INDEX = NEW.EVALUE;
;; 

----------------- (são script separados)

delimiter ;;

CREATE TRIGGER updateTrigger AFTER UPDATE ON BLAST
FOR EACH ROW 
	UPDATE BLAST_INDEX SET HIT_DESCRIPTION_INDEX = NEW.HIT_DESCRIPTION AND BLAST_EVALUE_INDEX = NEW.EVALUE WHERE ID_BLAST_INDEX = OLD.ID_BLAST;
;;

sempre que insiro um registo na tabela BLAST, na BLAST_INDEX onde supostamente deveria inserir o registo também fica com os campos a NULL e o ID_BLAST_INDEX que deve ser igual ao ID_BLAST fica a 0 :)

e tentei também o UPDATE mas fica na mesma com os campos a NULL e o ID a 0


...Join the dark side...and get a free cookie...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
M6

A sintaxe do comando insert standard não é essa, é Insert Into tabela (colunas) values (valores). Não sei se essa sintaxe funciona.

Se os campos ficam NULL é porque os valores originais vão a null. Por exemplo, se tiveres um ID que é auto-incremenado não sei se o mesmo já tem valor atribuído no before insert ou se só tem valor atribuído no after insert.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
diokhan

eu usei a sintaxe como encontrei aqui: http://dev.mysql.com/doc/refman/5.1/en/create-trigger.html

mas vou utilizar a versao standard e já digo algo. obrigado pela dica :)

quanto ao BEFORE E AFTER, como o ID_BLAST é auto incrementado penso que é melhor usar o AFTER, certo?

vou alterar a sintaxe e colocar para AFTER


...Join the dark side...and get a free cookie...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
diokhan

troquei isto:

delimiter ;;

CREATE TRIGGER insertTrigger BEFORE INSERT ON BLAST
    FOR EACH ROW
        INSERT INTO BLAST_INDEX SET ID_BLAST_INDEX = NEW.ID_BLAST AND HIT_DESCRIPTION_INDEX = NEW.HIT_DESCRIPTION AND BLAST_EVALUE_INDEX = NEW.EVALUE;
;; 

por isto:

delimiter ;;

CREATE TRIGGER insertTrigger AFTER INSERT ON BLAST
    FOR EACH ROW
        INSERT INTO BLAST_INDEX (ID_BLAST_INDEX, HIT_DESCRIPTION_INDEX, BLAST_EVALUE_INDEX) VALUES (NEW.ID_BLAST, NEW.HIT_DESCRIPTION, NEW.EVALUE);
;; 

e funcionou como deve ser, obrigado pela dica M6 :)

só não percebi o porque de não dar antes, porque estava a seguir o tutorial da pagina do mysql 🤔


...Join the dark side...and get a free cookie...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
M6

Não devia estar a dar antes porque o campo era auto-incrementado.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
diokhan

então quando for auto incrementado devo fazer o trigger para AFTER com a sintaxe standard certo? acho que já percebi a lógica :)


...Join the dark side...and get a free cookie...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
M6

Sim é isso.

Os campos auto-increment recebem o valor quando vão ser escritos na tabela, por isso antes de serem escritos não se sabe ainda o valor que vão receber.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.