1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

MySQL Trigger

Discussão em 'Programação' iniciada por Baderous, 30 de Dezembro de 2008. (Respostas: 7; Visualizações: 1642)

  1. Baderous

    Baderous Banido

    Estou a tentar fazer um trigger em que, após inserir um registo numa tabela, insiro noutra tabela alguns dados sobre esse último registo.
    Já tentei de 2 maneiras e não consigo resolver:

    Código:
    //Versão 1
    CREATE TRIGGER trg_historico AFTER INSERT ON ficheiros
       FOR EACH ROW BEGIN
          DECLARE utilizador VARCHAR;
          DECLARE date TIMESTAMP;
          DECLARE nome VARCHAR;
          SELECT username INTO utilizador FROM ficheiros WHERE id_ficheiro = (SELECT MAX(id_ficheiro) FROM ficheiros);
          SELECT date INTO date FROM ficheiros WHERE id_ficheiro = (SELECT MAX(id_ficheiro) FROM ficheiros);
          SELECT name INTO nome FROM ficheiros WHERE id_ficheiro = (SELECT MAX(id_ficheiro) FROM ficheiros);
          INSERT INTO historico (username,date,name) VALUES (utilizador,date,nome);
       END;
    Código:
    [/FONT]//Versão 2
    CREATE TRIGGER trg_historico AFTER INSERT ON ficheiros
       FOR EACH ROW
          BEGIN
             SELECT username,data,name INTO historico (username,data,name) FROM ficheiros WHERE id_ficheiro = (SELECT MAX(id_ficheiro) FROM ficheiros);
          END;
    A tabela "histórico" possui os campos:
    - id_historico
    - username
    - data
    - nome

    A tabela "ficheiros" possui, entre outros, os seguintes campos:
    - id_ficheiro
    - username
    - data
    - name

    Na versão 1 o erro que dá é: #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3 .

    Na versão 2 é: #1327 - Undeclared variable: historico . Acho estranho ele dizer isto, porque no w3schools diz que o que vem a seguir ao INTO é o nome de uma tabela, mas o que é certo é que já vi exemplos, quer em MySQL quer em Oracle, e realmente, o que aparece a seguir ao INTO é uma variável.

    Agradecia uma mãozinha.
     
  2. AliFromCairo

    AliFromCairo Power Member

    Boas, na primeira versão, tenta mudar o delimitador para $$ (i.e. DELIMITER $$) antes de criares o trigger, e coloca $$ a seguir à última linha do trigger. Em relação à segunda versão, penso que o que queres fazer é INSERT ... INTO ... SELECT, ao invés de SELECT ... INTO, ou seja, algo do género:

    Código:
    INSERT INTO historico(username,data,name)
     SELECT username, data, name
     FROM ficheiros
     WHERE id_ficheiro = (SELECT MAX(id_ficheiro) FROM ficheiros)
    
    Apenas tenho o SQL Server 2005 instalado, pelo que não me foi possível testar. De qualquer forma, espero que ajude.
     
    Última edição: 30 de Dezembro de 2008
  3. Baderous

    Baderous Banido

    Quanto à solução do DELIMITER, já tinha tentado mas continua a dar o mesmo erro.
    Quanto à 2ª solução, a query que indicaste funciona, mas dentro do trigger não dá, devo estar a colocar algum ponto e vírgula mal, ou então não sei:

    Código:
    CREATE TRIGGER trg_historico AFTER INSERT ON ficheiros
        FOR EACH ROW BEGIN
            INSERT INTO historico(username,data,name)
                 SELECT username, data, name
                 FROM ficheiros
                WHERE id_ficheiro = (SELECT MAX(id_ficheiro) FROM ficheiros)
            END;
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'END' at line 7
     
    Última edição: 31 de Dezembro de 2008
  4. AliFromCairo

    AliFromCairo Power Member

    Hmm, experimenta algo do género:

    Código:
    DELIMITER $$
     
    CREATE TRIGGER trg_historico AFTER INSERT ON ficheiros
    FOR EACH ROW 
    BEGIN
            INSERT INTO historico(username,data,name) SELECT username, data, name FROM ficheiros WHERE id_ficheiro = (SELECT MAX(id_ficheiro) FROM ficheiros);
    END;
    $$
     
    DELIMITER ;
    
    Já agora, confirma se a versão do MySQL que tens instalada suporta triggers. Penso que os triggers só foram incluídos na última versão.
     
  5. Baderous

    Baderous Banido

    Eu estou a usar a versão 5.0.67, que suporta triggers ( CREATE TRIGGER was added in MySQL 5.0.2. ).
    Agora aparece-me isto: #1235 - This version of MySQL doesn't yet support 'multiple triggers with the same action time and event for one table'
     
  6. Warlord

    Warlord [email protected] Member

    e pqja deves ter algum triger definido, consulta os triggers para a tabela...
     
  7. AliFromCairo

    AliFromCairo Power Member

    Sim, provavelmente. Podes utilizar a query SHOW TRIGGERS para verificar qual o trigger que está em conflito, para em seguida o removeres.
     
  8. Baderous

    Baderous Banido

    Depois de muitas tentativas, lá consegui:

    Código:
    DELIMITER $$ CREATE TRIGGER trg_historico AFTER  INSERT  ON ficheiros
    FOR EACH
    ROW 
    INSERT  INTO historico( username, 
    DATA , name ) 
    SELECT username, 
    DATA , name
    FROM ficheiros
    WHERE id_ficheiro = ( 
    SELECT MAX( id_ficheiro ) 
    FROM ficheiros ) ;
    
    $$
    Obrigado a todos. Resta agora ver se isto vai funcionar. (Se depois de 2 dias nisto não funcionar, mato alguém!).

    EDIT: Está a funcionar! :D
     
    Última edição: 31 de Dezembro de 2008

Partilhar esta Página