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 EnZiGuRi_, 21 de Abril de 2012. (Respostas: 16; Visualizações: 1914)

  1. Boas,

    DB1:
    INSERT INTO `towny_nations` (`name`, `towns`, (...etc...)) VALUES
    DB2:
    INSERT INTO `web_categories` (`id`, `parent`, `name`, (...etc...)) VALUES

    tenho estas duas tabelas em bases de dados diferentes, em que quero que crie outra linha na DB2 com o campo name da DB1 e adicionar o numero 10 no campo parent. queria fazer exactamente o mesmo com outras tabelas da DB1. Se o nome na DB1 alterar deve tambem alterar apenas o nome na DB2.

    Isto tudo a tempo real, sem ter que executar o script para fazer essa copia, uma especie de loop... (trigger)

    Se alguem tiver alguma solução agradecia (tutoriais, pedaços de codigo etc), visto que não sou la grande espingarda em bases de dados...

    Obrigado desde ja
     
  2. HeXel

    HeXel Folding Member

  3. vou dar uma olhadela, acho que já estive nessa pagina antes.

    Se alguem me conseguir dar pedaços de codigo agradecia, é que como já disse nao sou grande coisa nisto e toda a ajuda é bemvinda!

    Obrigado
     
  4. pois, continuo em perceber, so me explica como fazer dentro da mesma database :S
     
  5. xBoShY

    xBoShY Power Member

    Se for no mesmo servidor de SQL, é quase como ser fosse na mesma database...

    INSERT INTO DB2.`web_categories` (`id`, `parent`, `name`, (...etc...)) VALUES
     
  6. ok obrigado, vou ver se resulta
     
  7. delimiter |

    CREATE TRIGGER nation_create AFTER INSERT ON mc_towny.towny_nations
    FOR EACH ROW BEGIN
    INSERT INTO website.web_kunena_categories SET name = NEW.name;
    END;
    |

    delimiter ;

    Como já disse nao percebo la muito de mysql, tenho este pedaço de codigo e está a darme este erro... só quero copiar uma coluna para já, talvez 2 ou 3 quando conseguir copiar uma... mas para já quero por a funcionar so com uma...

    Error Code: 1235. This version of MySQL doesn't yet support 'multiple triggers with the same action time and event for one table'

    alguém consegue dizerme como funciona? :S

    Obrigado
     
  8. xBoShY

    xBoShY Power Member

    Acrescenta a linha:
    Código:
    delimiter |
    
    [COLOR="#B22222"]DROP TRIGGER IF EXISTS nation_create|[/COLOR]
    CREATE TRIGGER nation_create AFTER INSERT ON mc_towny.towny_nations
      FOR EACH ROW BEGIN
        INSERT INTO website.web_kunena_categories SET name = NEW.name;
      END;
    |
    
    delimiter ;
    Atenção que só podes ter um evento (INSERT, UPDATE, DELETE) + timing (AFTER, BEFORE) por tabela.

    Em MySQL, uma forma de ver os triggers já existentes (nome, tabela, evento, timing):
    Código:
    SELECT TRIGGER_NAME, EVENT_OBJECT_TABLE, ACTION_TIMING, EVENT_MANIPULATION
    FROM INFORMATION_SCHEMA.TRIGGERS
     
    Última edição: 24 de Abril de 2012
  9. ok obrigado, quanto aos timing nao posso por exemplo criar 2 triggers, um com after e outro com before?? como sao separados deve funcionar nao? só por curiosidade, gosto de ficar esclarecido no que vou apredendo...

    cumps
     
  10. xBoShY

    xBoShY Power Member

    Podes =) O que não podes ter é um par de eventos + timings iguais para a mesma tabela.

    Isto é possivel:
    Código:
    TRIGGER_NAME		|	EVENT_OBJECT_TABLE		|	ACTION_TIMING		|	EVENT_MANIPULATION
    tr_tbl1_after_insert	|	tbl1				|	AFTER			|	INSERT
    tr_tbl1_before_insert	|	tbl1				|	BEFORE			|	INSERT
    tr_tbl1_before_update	|	tbl1				|	BEFORE			|	UPDATE
    E isto não é possivel:
    Código:
    TRIGGER_NAME		|	EVENT_OBJECT_TABLE		|	ACTION_TIMING		|	EVENT_MANIPULATION
    tr_tbl1_after_insert_1	|	tbl1				|	AFTER			|	INSERT
    tr_tbl1_after_insert_2	|	tbl1				|	AFTER			|	INSERT
     
  11. okey obrigado, esclarecido!

    Código:
    `towny_nations` (`name`, `towns`, (...etc...))
    
    `towny_towns` (`name`, (...etc...), `nation`, (...etc...))
    
    `web_categories` (`id`, `parent`, `name`, (...etc...))
    
    bem agora surgiu-me um grande problema, então, explicando a teoria, cada nation tem várias/uma town, e uma town pode ter nation ou nao. Bem, a tabela web_categories pertence a um forum, que tem uma secção das nations/towns, em que estão organizadas como na "realidade" cada town na sua respectiva nation.
    na tabela towns quero criar um trigger para ir buscar name das categories, depois inserir o id dessa linha no campo parent da linha que vou criar. ou seja,

    Código:
    `web_categories` (`1`, `5`, `Nation_Test`, (...etc...))
    
    a linha criada irá ficar assim:
    Código:
    `web_categories` (`2`, `1`, `Town_Test`, (...etc...))
    
    assim a town_test irá ficar dentro da nation_test... que é o que eu pretendo...

    alguma solução?

    cumps
     
    Última edição: 24 de Abril de 2012
  12. já consegui resolver este problema, estou a aprender muito com isto :)

    estou agora com uma pequena duvida

    neste trigger quero fazer update das towns no forum, ou seja alterar apenas o parent e o name no forum quando as towns forem alteradas... acontece que não estou a conseguir faze-lo de maneira a alterar o parent para o id da nation respectiva.

    Código:
    delimiter |
    DROP TRIGGER IF EXISTS town_update|
    CREATE TRIGGER town_update BEFORE UPDATE ON mc_towny.towny_towns
        FOR EACH ROW
            BEGIN
            SET @ID = (SELECT id FROM website.web_kunena_categories WHERE name = NEW.nation);
            SET @TOWN = (SELECT name FROM mc_towny.towny_towns WHERE name = NEW.name);
                IF EXISTS (SELECT parent FROM website.web_kunena_categories WHERE name = NEW.name) THEN
                    UPDATE website.web_kunena_categories
                    SET parent = @ID
                    WHERE name = @town;
                    UPDATE website.web_kunena_categories
                    SET name = NEW.name
                    WHERE name = @town;
                ELSE
                    INSERT INTO website.web_kunena_categories VALUES ('', @ID, NEW.name, 0, 0, 0, 1, NULL, 'joomla.level', 1, 1, 1, 8, 1, '', 0, 1, 0, '0000-00-00 00:00:00', 0, 0, 0, 0, '', '', '', 0, 0, 0, 0, 0);
                END IF;
            END;
    | delimiter ;
     
  13. xBoShY

    xBoShY Power Member

    Não percebi bem o output desejado, mas parece-me que estás a complicar algo que em principio parece ser mais simples =)

    Até agora percebi:
    - Uma Nation possui uma ou mais Towns.
    - Uma Town só pode pertencer a uma Nation.


    E queres criar uma tabela web_categories. As minhas dúvidas são:
    Qual é a estrutura desta tabela?
    O que deverá ela conter? Qual a relação desta tabela com a tabela Town e a tabela Nation?
     
  14. xD peço desculpa por nao me fazer entender, entretanto já consegui fazer o que queria em relação ás questoes anteriores...

    só uma pergunta, a tabela categories tem uma coluna que é a ordem das categorias do forum, acontece que tenho que dar numeros a elas, 1, 2, etc etc. essa coluna não é de auto increment, é possivel acrescentar 1 ao valor maior daquela coluna? é que ainda nao testei alterar a coluna para auto increment... por isso nao faço a minima se irei estragar a maneira como funciona o forum...

    obrigado
     
  15. xBoShY

    xBoShY Power Member

    Código:
    INSERT INTO tabela
    VALUES (
    	(SELECT ultimo_id + 1
    	 FROM 	(SELECT max(id) as ultimo_id 
    		 FROM tabela) as next_id),
    	outro valor, 
    	outro valor,
    	etc,)
     
  16. Bem, com este padaço de codigo o que me está a dar a entender é que nao está a "ler" a parte to ELSE principal(segundo).

    Alguém me consegue ajudar a encontrar onde está o erro?

    obrigado

    Código:
    delimiter |
    DROP TRIGGER IF EXISTS town_create|
    CREATE TRIGGER town_create BEFORE INSERT ON mc_towny.towny_towns
        FOR EACH ROW
            BEGIN
            SET @ID = (SELECT id FROM website.web_kunena_categories WHERE name = NEW.nation);
            SET @TOWN = (SELECT name FROM mc_towny.towny_towns WHERE name = NEW.name);
            SET @NEWID = (select max(ordering) from website.web_kunena_categories);
                IF EXISTS (SELECT parent FROM website.web_kunena_categories WHERE name = NEW.name)
                    THEN
                        IF (SELECT nation FROM mc_towny.towny_towns WHERE name = NEW.name) IS NULL THEN
                            UPDATE website.web_kunena_categories
                            SET parent = 14
                            WHERE name = @town;
                        ELSE
                            UPDATE website.web_kunena_categories
                            SET parent = @ID
                            WHERE name = @town;
                        END IF;
                ELSE
                    IF (SELECT nation FROM mc_towny.towny_towns WHERE name = NEW.name) IS NULL THEN
                        INSERT INTO website.web_kunena_categories VALUES ('', 14, NEW.name, 0, 0, 0, 1, NULL, 'joomla.level', 1, 1, 1, 8, 1, @NEWID + 1, 0, 1, 0, '0000-00-00 00:00:00', 0, 0, 0, 0, '', '', '', 0, 0, 0, 0, 0);
                    ELSE
                        INSERT INTO website.web_kunena_categories VALUES ('', @ID, NEW.name, 0, 0, 0, 1, NULL, 'joomla.level', 1, 1, 1, 8, 1, @NEWID + 1, 0, 1, 0, '0000-00-00 00:00:00', 0, 0, 0, 0, '', '', '', 0, 0, 0, 0, 0);
                    END IF;
                END IF;
            END;
    | delimiter ;
     
    Última edição: 30 de Abril de 2012
  17. bem ja resolvi, obrigado pela ajuda
     

Partilhar esta Página