AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 106783
Accepted
ReynierPM
ReynierPM
Asked: 2015-07-14 07:26:56 +0800 CST2015-07-14 07:26:56 +0800 CST 2015-07-14 07:26:56 +0800 CST

Como atualizar valores de linha com valores de SELECT em outro banco de dados em um gatilho

  • 772

Eu tenho trabalhado em um gatilho para INSERT|UPDATEvalores para um determinado registro com base no mesmo PK. O que o gatilho basicamente deve fazer é, foreach rowquando algum INSERTacontece em veeva_new.account:

  • Verifique se o PK já existe, se existir, obtenha os valores veeva_new.accounte as UPDATEcolunas empdone.targets
  • Se PK não existir, então INSERTa nova linha (copie a linha de veeva_new.accountpara pdone.targets)

Isto é o que eu tenho até agora:

#Account ON INSERT AFTER => Add a new record to the targets table or UPDATE its values if record already exists (checking by PK)
USE `veeva_new`;

DELIMITER $$

DROP TRIGGER IF EXISTS veeva_new.account_ai$$
USE `veeva_new`$$
CREATE DEFINER = CURRENT_USER TRIGGER `veeva_new`.`account_ai` AFTER INSERT ON `account` FOR EACH ROW
BEGIN
    DECLARE vCount INT(6) DEFAULT 0;

    SET vCount=(SELECT COUNT(*) FROM pdone.targets WHERE targets.veeva_account_id=NEW.id);
    IF (vCount>0) THEN
        SET @TargetLastMod=(SELECT targets.lastSyncAt FROM pdone.targets WHERE targets.veeva_account_id=NEW.id LIMIT 0,1); 

        IF (NEW.lastmodifieddate > @TargetLastMod) THEN
            # [Will execute a query for get values from veeva]
            SELECT 
                account.id AS veeva_account_id,
                account.lastmodifieddate AS veeva_timestamp,
                pdone.LCAPITAL(CONCAT(`first`,' ',`last`)) as display_name,
                'https://pdone.s3.amazonaws.com/avatar/no_avatar.png' AS avatar_url,
                account.title__c AS `title`,
                account.firstname AS pdone.LCAPITAL(`first`),
                account.lastname AS pdone.LCAPITAL(`last`),
                account.suffix_vod__c AS `suffix`,
                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`,
                -- `state_licensed_id`
                'VEEVA' AS `target_type`,
                account.npi_vod__c AS `npi`,
                FALSE AS `inactive`,
                NOW() AS `lastSyncAt`,
                NOW() AS `createdAt`,
                NOW() AS `updatedAt`
                -- address_vod__c.primary_vod__c,
                -- address_vod__c.license_vod__c,
                -- address_vod__c.lastmodifieddate AS addresslastmodifieddate
            FROM
                account
                    JOIN
                address_vod__c ON address_vod__c.account_vod__c = account.id
            WHERE
                account.id = NEW.id
                    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 veeva_new.recordtype WHERE name = 'Professional_vod');

            # [Will update all values for targets]
            UPDATE pdone.targets 
            SET
            `veeva_account_id` =,
            `veeva_timestamp` =,
            `display_name` =,
            `avatar_url` =,
            `title` =,
            `first` =,
            `last` =,
            `suffix` =,
            `address1` =,
            `address2` =,
            `city` =,
            `state` =,
            `zip` =,
            `phone` =,
            `fax` =,
            `target_type` =,
            `npi` =,
            `inactive` =,
            `lastSyncAt` = NOW(),
            `updatedAt` = NOW()
            WHERE targets.veeva_account_id=NEW.id; 
        END IF;
    ELSE
        INSERT INTO pdone.targets
        (`veeva_account_id`,`veeva_timestamp`,`display_name`,`avatar_url`,`title`,`first`,`last`,`suffix`,`address1`,`address2`,`city`,`state`,`zip`,`phone`,`fax`,`target_type`,`npi`,`inactive`,`lastSyncAt`,`createdAt`,`updatedAt`)
        SELECT 
            account.id AS veeva_account_id,
            account.lastmodifieddate AS veeva_timestamp,
            pdone.LCAPITAL(CONCAT(`first`,' ',`last`)) as display_name,
            'https://pdone.s3.amazonaws.com/avatar/no_avatar.png' AS avatar_url,
            account.title__c AS `title`,
            account.firstname AS pdone.LCAPITAL(`first`),
            account.lastname AS pdone.LCAPITAL(`last`),
            account.suffix_vod__c AS `suffix`,
            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`,
            -- `state_licensed_id`
            'VEEVA' AS `target_type`,
            account.npi_vod__c AS `npi`,
            FALSE AS `inactive`,
            NOW() AS `lastSyncAt`,
            NOW() AS `createdAt`,
            NOW() AS `updatedAt`
            -- address_vod__c.primary_vod__c,
            -- address_vod__c.license_vod__c,
            -- address_vod__c.lastmodifieddate AS addresslastmodifieddate
        FROM
            account
                JOIN
            address_vod__c ON address_vod__c.account_vod__c = account.id
        WHERE
            account.id = NEW.id
                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 veeva_new.recordtype WHERE name = 'Professional_vod');
    END IF;
END
$$
DELIMITER ;

O gatilho não funcionará, pois tem muitos problemas e estou tentando corrigi-los, então, entre as linhas # [Will execute a query for get values from veeva], # [Will update all values for targets]devo executar uma consulta veeva_new.accounte obter a linha atual com base em PKporque ela PKjá existe e, em seguida, devo passar valores SELECTpara o UPDATEdeclaração antes # [Will update all values for targets]do comentário, como posso conseguir isso?

update trigger
  • 1 1 respostas
  • 513 Views

1 respostas

  • Voted
  1. Best Answer
    oNare
    2015-07-14T08:05:50+08:002015-07-14T08:05:50+08:00

    Eu modifiquei o seu TRIGGERe usei todos ON DUPLICATE KEY UPDATEos UPDATEcampos quando você NEW.lastmodifieddatefor maior que targets.lastSyncAt.

    Alguns erros :

    • Você usou um functionem um rótulo de campo em pdone.LCAPITAL(first), isso não pode ser possível.
    • Você usou o mesmo functionagora tentando CONCAT2 rótulos de campo, em vez de nomes de campos de tabela pdone.LCAPITAL(CONCAT(first,' ',last)).

    Agora, tente esta atualização do TRIGGER:

    USE `veeva_new`;
    
    DELIMITER $$
    
    DROP TRIGGER IF EXISTS veeva_new.account_ai$$
    USE `veeva_new`$$
    CREATE DEFINER=`root`@`localhost` TRIGGER `veeva_new`.`account_ai` AFTER INSERT ON `account` FOR EACH ROW
    BEGIN
        DECLARE vCount INT(6) DEFAULT 0;
        SET vCount=(SELECT COUNT(*) FROM pdone.targets WHERE targets.veeva_account_id=NEW.id);
        IF (vCount>0) THEN
            SET @TargetLastMod=(SELECT targets.lastSyncAt FROM pdone.targets WHERE targets.veeva_account_id=NEW.id LIMIT 0,1); 
            # [ IF EXISTS IN pdone.targets, UPDATE only if NEW.lastmodifieddate IS GREATER than @TargetLastMod ]
            IF (NEW.lastmodifieddate > @TargetLastMod) THEN
                INSERT INTO pdone.targets
                (`veeva_account_id`,`veeva_timestamp`,`display_name`,`avatar_url`,`title`,`first`,`last`,`suffix`,`address1`,`address2`,`city`,`state`,`zip`,`phone`,`fax`,`target_type`,`npi`,`inactive`,`lastSyncAt`,`createdAt`,`updatedAt`)
                SELECT 
                    account.id AS veeva_account_id,
                    account.lastmodifieddate AS veeva_timestamp,
                    pdone.LCAPITAL(CONCAT(account.firstname,' ',account.lastname)) as display_name,
                    'https://pdone.s3.amazonaws.com/avatar/no_avatar.png' AS avatar_url,
                    account.title__c AS `title`,
                    pdone.LCAPITAL(account.firstname) AS `first`,
                    pdone.LCAPITAL(account.lastname) AS `last`,
                    account.suffix_vod__c AS `suffix`,
                    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`,
                    -- `state_licensed_id`
                    'VEEVA' AS `target_type`,
                    account.npi_vod__c AS `npi`,
                    FALSE AS `inactive`,
                    NOW() AS `lastSyncAt`,
                    NOW() AS `createdAt`,
                    NOW() AS `updatedAt`
                    -- address_vod__c.primary_vod__c,
                    -- address_vod__c.license_vod__c,
                    -- address_vod__c.lastmodifieddate AS addresslastmodifieddate
                FROM
                    account
                        JOIN
                    address_vod__c ON address_vod__c.account_vod__c = account.id
                WHERE
                    account.id = NEW.id
                        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 veeva_new.recordtype WHERE name = 'Professional_vod')
                ON DUPLICATE KEY UPDATE
                # `veeva_account_id` =, THIS IS TE PK, COULDNT BE UPDATE
                `veeva_timestamp` =NEW.lastmodifieddate,
                `display_name` = pdone.LCAPITAL(CONCAT(account.firstname,' ',account.lastname)),
                `avatar_url` = 'https://pdone.s3.amazonaws.com/avatar/no_avatar.png',
                `title` =account.title__c,
                `first` =pdone.LCAPITAL(account.firstname),
                `last` =pdone.LCAPITAL(account.lastname),
                `suffix` =account.suffix_vod__c,
                `address1` =address_vod__c.name,
                `address2` =address_vod__c.address_line_2_vod__c,
                `city` =address_vod__c.city_vod__c,
                `state` =address_vod__c.state_vod__c,
                `zip` =address_vod__c.zip_vod__c,
                `phone` =address_vod__c.phone_vod__c,
                `fax` =address_vod__c.fax_vod__c,
                `target_type` ='VEEVA',
                `npi` =account.npi_vod__c,
                `inactive` =FALSE,
                `lastSyncAt` = NOW(),
                `updatedAt` = NOW();
            END IF;
        ELSE
            INSERT INTO pdone.targets
                (`veeva_account_id`,`veeva_timestamp`,`display_name`,`avatar_url`,`title`,`first`,`last`,`suffix`,`address1`,`address2`,`city`,`state`,`zip`,`phone`,`fax`,`target_type`,`npi`,`inactive`,`lastSyncAt`,`createdAt`,`updatedAt`)
                SELECT 
                    account.id AS veeva_account_id,
                    account.lastmodifieddate AS veeva_timestamp,
                    pdone.LCAPITAL(CONCAT(account.firstname,' ',account.lastname)) as display_name,
                    'https://pdone.s3.amazonaws.com/avatar/no_avatar.png' AS avatar_url,
                    account.title__c AS `title`,
                    pdone.LCAPITAL(account.firstname) AS `first`,
                    pdone.LCAPITAL(account.lastname) AS `last`,
                    account.suffix_vod__c AS `suffix`,
                    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`,
                    -- `state_licensed_id`
                    'VEEVA' AS `target_type`,
                    account.npi_vod__c AS `npi`,
                    FALSE AS `inactive`,
                    NOW() AS `lastSyncAt`,
                    NOW() AS `createdAt`,
                    NOW() AS `updatedAt`
                    -- address_vod__c.primary_vod__c,
                    -- address_vod__c.license_vod__c,
                    -- address_vod__c.lastmodifieddate AS addresslastmodifieddate
                FROM
                    account
                        JOIN
                    address_vod__c ON address_vod__c.account_vod__c = account.id
                WHERE
                    account.id = NEW.id
                        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 veeva_new.recordtype WHERE name = 'Professional_vod');
        END IF;
    END$$
    DELIMITER ;
    

    Espero que isto ajude.

    • 1

relate perguntas

  • É sábio usar o gatilho para atualizar outra tabela?

  • armazenar conjunto de resultados em tabela temporária, variável ou variáveis ​​separadas dentro de um gatilho

  • Gatilho: mova as linhas excluídas para a tabela de arquivo

  • Erro de impasse do SQL Server 2000 para o SQL Server 2008

  • Em um gatilho, posso determinar se uma coluna foi explicitamente definida como um valor ou não foi mencionada na instrução de atualização?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve