MySQL Trigger

EnZiGuRi_

Membro
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
 
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
 
Se for no mesmo servidor de SQL, é quase como ser fosse na mesma database...

INSERT INTO DB2.`web_categories` (`id`, `parent`, `name`, (...etc...)) VALUES
 
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
 
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:
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
 
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
 
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:
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 ;
 
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?
 
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
 
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,)
 
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:
Back
Topo