Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

HelioCesar

Atualizar tabela em dois bancos de dados

Recommended Posts

Ola pessoal estou usando PHPMYADMIN, meu problema é o seguinte, tenho dois bancos de dados BANCO1 e BANCO2, algumas tabelas se repete nós dois bancos e É justamente nessas tabelas que eu quero fazer uma atualização. Tudo que tenho na tabela PRODUTO no BANCO1 tenho que ter na tabela PRODUTO no BANCO2. então fui no BANCO1 na tabela PRODUTO e fiz uma trigger.

 

BANCO1

insert into banco2.produto (prod_descricao, 
	prod_unidade, prod_embalagem, prod_status)
values (new.prod_descricao, new.prod_unidade, 
	new.prod_embalagem, new.prod_status)

beleza, quando insiro um item na tabela no BANCO1 ele insere também na tabela do BANCO2.

 

Agora se vou no BANCO2 e crio uma trigger conforme no BANCO1.

 

BANCO2

insert into banco1.produto (prod_descricao, 
	prod_unidade, prod_embalagem, prod_status)
values (new.prod_descricao, new.prod_unidade, 
	new.prod_embalagem, new.prod_status)

Quando vou inserir um novo cadastro em ambos os bancos ele da o seguinte erro.

Erro
consulta SQL: Editar
INSERT INTO `banco2`.`produto` (
`prod_id` ,
`prod_descricao` ,
`prod_unidade` ,
`prod_embalagem` ,
`prod_status`
)
VALUES (
NULL , 'teste', 'UN', 'CX-12-UN', 'A'
)

Mensagens do MySQL : Documentação
#1442 - Can't update table 'produto' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 

Alguém tem uma ideia de como posso fazer essa atualização nos dois bancos direto pelo banco.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O b1 insere no b2 isto dispara a trigger que insere no b1 este então insere no b2 que ....

Compartilhar este post


Link para o post
Compartilhar em outros sites

resumindo, quando o usuário entrar no b1 e for inserir na tabela do b1 ele dispara a trigger e insere no b2, e quando o usuário entra no b2 e for inserir na tabela do b2 ele dispara a trigger e insere no b1.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só que estas triggers entrariam numa recursividade infinita.

 

Tente criar uma coluna ORIGEM , na chamada normal rdceberia o proprio bd , na via trigger receberia o outro bd, seca orimem fosse do outro bd o insert não seria feito.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você esta dizendo criar uma coluna a mais nas duas tabelas dos bancos, e nela vai ser inserida alguma coisa que identifique se o insert esta sendo feito na origem ou por trigger.

 

É criar uma trigger com uma condição para fazer o insert?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Basicamente campo origem nas duas tabelas

b1 
insert into ..... (........'banco1'...)

Na triger do b1

If :origem = 'banco1' then
  insert into "b2" )  'banco1' ...) 
b2
insert into ..... (........'banco2'...)

Na triger do b2

If :origem = 'banco2' then
  insert into "b1" ) 'banco2' ...) 

Se a Origem do Insert vier do outro bd não chamará o INSERT só no próprio BD.

 

Creio ser esta uma solução possível

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta criei a coluna conforme orientação nós dois bancos, segue abaixo a trigger, e o erre que esta dando quando faço o insert.

no values para receber no b2 já coloquei new.prod_origem que é o novo valor do campo no b1 e de outro jeito conforme o código abaixo.

 

TRIGGER B1:

if prod_origem = 'B1' then
insert into b2.produto (prod_descricao, 
	prod_unidade, prod_embalagem, prod_status, 
        prod_origem)
values (new.prod_descricao, new.prod_unidade, 
	new.prod_embalagem, new.prod_status, 
        'B1');
end if;

Abaixo o erro.

Erro
consulta SQL: Editar

INSERT INTO  `b1`.`produto` (

`prod_id` ,
`prod_descricao` ,
`prod_unidade` ,
`prod_embalagem` ,
`prod_status` ,
`prod_origem`
)
VALUES (
NULL ,  'TESTE HELIO2',  'UN',  'CX-12-UN',  'A',  'B1'
)
Mensagens do MySQL : Documentação

#1054 - Unknown column 'prod_origem' in 'field list' 

Compartilhar este post


Link para o post
Compartilhar em outros sites

faltava eu colocar o new antes para referenciar a coluna, new.prod_origem.

agora o insert esta funcionando normalmente.

e criei a trigger para UPDATE.

B1

if new.prod_origem = 'B1' then
update B2.produto set
	prod_descricao=new.prod_descricao, 
        prod_unidade=new.prod_unidade, 
        prod_embalagem=new.prod_embalagem, 
        prod_status=new.prod_status 
        	where 
                	prod_id=new.prod_id;
end if

B2

if new.prod_origem = 'B2' then
update B1.produto set
	prod_descricao=new.prod_descricao, 
        prod_unidade=new.prod_unidade, 
        prod_embalagem=new.prod_embalagem, 
        prod_status=new.prod_status 
        	where 
                	prod_id=new.prod_id;
end if 

se o item foi cadastrado pelo B1 e eu estiver no B1 ele faz o update normalmente agora se eu entro no B2 vou no item que foi cadastrado no B1 ele não deixa eu atualizar nem se eu mudar o campo prod_origem que esta B1 para B2.

Erro
consulta SQL: Editar Editar

UPDATE  `B2`.`produto` SET  `prod_descricao` =  'teste1',
`prod_origem` =  'B2' WHERE  `produto`.`prod_id` =4935

Mensagens do MySQL : Documentação

#1442 - Can't update table 'produto' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 

esse item foi cadastrado no banco B1, e entrei no banco B2 e tentei alterar a descrição e o campo origem para B2 se não ele não faz o UPDATE.

Tentei colocar duas condições na trigger.

if ((new.prod_origem = 'B1') or (new.prod_origem = 'B2')) then

também da o erro.

alguma ideia?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.