Eu tenho dois bancos de dados pdone
e arquivos veevan
. pdone
é uma espécie de mestre e veevan
continua a sincronizar com fontes externas. Eu preciso realizar uma sincronização interna entre eles veevan
e pdone
por isso estou usando gatilhos para conseguir isso. Agora em pdone
db eu tenho uma mesa targets
e em veevan
eu tenho uma mesa address_vod__c
. Sempre que um novo registro é inserido address_vod__c
ou sempre que um registro é atualizado, preciso atualizar a linha em, pdone.targets
então é assim que o processo deve ser executado:
INSERT
um novo registro emveevan.address_vod__c
, entãoSELECT
a linha inserida atual (os valores) encontra a correspondência empdone.targets
eUPDATE
colunasUPDATE
um registro emveevan.address_vod__c
, entãoSELECT
a linha atualizada atual (os valores) encontra a correspondência empdone.targets
eUPDATE
colunas
Isto é o que eu tenho até agora:
USE `veevan`;
DELIMITER $$
DROP TRIGGER IF EXISTS veevan.account_ai$$
USE `veevan`$$
CREATE DEFINER=`root`@`localhost` TRIGGER `veevan`.`address_vod__c_ai` AFTER INSERT ON `address_vod__c` FOR EACH ROW
BEGIN
DECLARE vCount INT(6) DEFAULT 0;
SET vCount=(SELECT COUNT(*) FROM pdone.targets WHERE targets.veeva_account_id=NEW.account_vod__c);
IF (vCount>0) THEN
SET @TargetLastMod=(SELECT targets.lastSyncAt FROM pdone.targets WHERE targets.veeva_account_id=NEW.account_vod__c LIMIT 0,1);
UPDATE pdone.targets
SET
`address1` = avc.address1,
`address2` = avc.address2,
`city` = avc.city,
`state` = avc.state,
`zip` = avc.zip,
`phone` = avc.phone,
`fax` = avc.fax,
`lastSyncAt` = NOW(),
`updatedAt` = NOW()
FROM (
SELECT
address_vod__c.name AS `address1`,
address_vod__c.address_line_2_vod__c AS `address2`,
address_vod__c.city_vod__c AS `city`,
address_vod__c.state_vod__c AS `state`,
address_vod__c.zip_vod__c AS `zip`,
address_vod__c.phone_vod__c AS `phone`,
address_vod__c.fax_vod__c AS `fax`
FROM
address_vod__c avc
WHERE
address_vod__c.account_vod__c = NEW.account_vod__c
AND external_id_vod__c IS NOT NULL
AND address_vod__c.primary_vod__c = 1
AND account.recordtypeid COLLATE utf8_general_ci IN (SELECT id FROM veevan.recordtype WHERE name = 'Professional_vod')
)
WHERE
targets.veeva_account_id=NEW.account_vod__c;
END IF;
END$$
DELIMITER ;
Mas não sei se o UPDATE
uso que SELECT
vai funcionar e essa é a minha dúvida, como faço para conseguir um UPDATE a partir do SELECT? Sempre que tento executar esse SQL, recebo este erro:
Código de erro: 1064. Ocorreu um erro em sua sintaxe SQL; verifique o manual que corresponde à sua versão do servidor MariaDB para a sintaxe correta a ser usada perto de 'FROM SELECT address_vod__c.name AS
address1
, addr' na linha 19
Alguém pode me dar algum feedback e | ou ajudar sobre isso?
veeva_account_id
é o PK ligado pdone.targets
e account_vod__c
é o FK (mais ou menos desde que o DB não tem relacionamentos reais) em veevan.address_vod__c
.
Sua
UPDATE
afirmação está errada. Eu editei o seuTRIGGER
e as modificações que fiz e os erros que vi:Erros:
TRIGGER
daquele que você vai criar.DROP TRIGGER IF EXISTS veevan.account_ai$$
.@TargetLastMod
? Você não o usou no todotrigger
.Modificações:
DROP TRIGGER
with .veevan.address_vod__c_ai
veevan.account_ai
JOIN
com os mesmos campos do seuSELECT
, com(address_vod__c.account_vod__c = NEW.account_vod__c AND targets.veeva_account_id=NEW.account_vod__c)
noUPDATE
.ACIONAR:
Tente!