Eu dois DBs veeva
e pdone
como mostrado abaixo nas fotos
Como você pode ver veeva
, é simples e não possui restrições que dependem de valores duplicados e incorretos. O problema acontece exatamente userterritory
onde a user
é atribuído a um ou mais arquivos territory
. No novo banco de dados pdone
isso não é permitido, então preciso encontrar - de veeva
- aqueles representantes que possuem apenas um territory
e consegui isso por meio desta consulta:
SELECT
count(*) AS reps,
userid,
lastmodifieddate,
territoryid
FROM
(
SELECT
userid,
territoryid,
count(*) AS territories
FROM
userterritory
GROUP BY
userid
HAVING
territories = 1
) T1
INNER JOIN (
SELECT
id AS userid,
lastmodifieddate
FROM
`user`
WHERE
`user`.`id` IN (
SELECT
userterritory.`userid`
FROM
userterritory
)
) T2 USING (userid)
GROUP BY
territoryid
HAVING
reps = 1
Depois INSERT
de cada userterritory
um, executo um gatilho que atualiza a reps
tabela configurando o direito territories_id
com base no relacionamento de userterritory
. Este é o código do gatilho:
CREATE DEFINER=`root`@`localhost` TRIGGER `veeva_new`.`userterritory_ai` AFTER INSERT ON `userterritory` FOR EACH ROW
BEGIN
# [ VARIABLES DECLARATION ]
DECLARE vUserID VARCHAR(18) DEFAULT '';
DECLARE vTerritoriRep VARCHAR(45) DEFAULT '';
DECLARE vTerrytoriLastMod DATETIME DEFAULT '0000-00-00 00:00:00';
# [ VARIABLES ASIGNATION ]
SET vUserID =NEW.userid;
SET vTerritoriRep =(select IFNULL(reps.territories_id,'N/A') from pdone.reps where reps.veeva_rep_id=vUserID LIMIT 0,1);
SET vTerrytoriLastMod=(SELECT reps.lastSyncAt FROM pdone.reps WHERE reps.veeva_rep_id=vUserID LIMIT 0,1);
IF (NEW.territoryid != vTerritoriRep) THEN
UPDATE pdone.reps
SET reps.territories_id = NEW.territoryid,
reps.lastSyncAt = IF(NOW()>vTerrytoriLastMod,NOW(),reps.lastSyncAt),
reps.updatedAt=now()
WHERE reps.veeva_rep_id=vUserID;
END IF;
END
Tudo está funcionando perfeitamente, mas estou ficando reps
com territories_id
nulled e isso não é permitido pois cada um reps
tem que ser atribuído a um territories
. Veja esta foto:
Então, como aplico minha consulta ao gatilho para obter resultados corretos? Alguém pode me dar uma ajuda?
Eu editei o seu
TRIGGER
para fazer isso:Eu adicionei a
vTerritoryCount
variável.Se você tiver mais de 1 linha com o mesmo
userid
, ele não atualizará o arquivoreps.territories_id
.Aqui está o
TRIGGER
: