Postgresql вызывает условие IF, чтобы увидеть, есть ли в таблице назначения эта запись - PullRequest
0 голосов
/ 09 января 2020

У меня есть прямая функция триггера, которая настроена на запуск по UPDATE или INSERT в таблице.

Когда этот триггер работает, я хочу вставить запись в другую таблицу, только если это не так уже существует там.

Я мог бы просто проигнорировать проверку и позволить неудачной вставке, но я чувствую, что это не лучший подход.

-- Trigger
CREATE TRIGGER archivelogic_trigger AFTER INSERT OR UPDATE ON entsf.et4ae5__individualemailresult__c
FOR EACH ROW EXECUTE PROCEDURE entsf.archivelogicfunc();


-- Function
CREATE OR REPLACE FUNCTION entsf.archivelogicfunc() RETURNS TRIGGER AS $result_table$
   BEGIN       
BEGIN
        IF (DATE(NEW.et4ae5__datesent__c) < NOW() - INTERVAL '180 days' 
        AND DATE(NEW.et4ae5__datesent__c) > NOW() - INTERVAL '540 days'
        AND NEW.id NOT IN (SELECT id FROM archive.individualemailresult__c)) -- this seems expensive
        THEN
          INSERT INTO archive.individualemailresult__c 
                (dateopened__c, 
                 numberoftotalclicks__c, 
                 datebounced__c, 
                 fromname__c, 
                 hardbounce__c, 
                 fromaddress__c, 
                 softbounce__c, 
                 name, 
                 lastmodifieddate, 
                 opened__c, 
                 ownerid, 
                 subjectline__c, 
                 isdeleted, 
                 contact__c, 
                 systemmodstamp, 
                 lastmodifiedbyid, 
                 datesent__c, 
                 dateunsubscribed__c, 
                 createddate, 
                 createdbyid, 
                 lead__c, 
                 tracking_as_of__c, 
                 numberofuniqueclicks__c, 
                 senddefinition__c, 
                 mergeid__c, 
                 triggeredsenddefinition__c, 
                 sfid, 
                 id, 
                 _hc_lastop, 
                 _hc_err)
            VALUES 
                (NEW.et4ae5__dateopened__c, 
                NEW.et4ae5__numberoftotalclicks__c, 
                NEW.et4ae5__datebounced__c, 
                NEW.et4ae5__fromname__c, 
                NEW.et4ae5__hardbounce__c, 
                NEW.et4ae5__fromaddress__c, 
                NEW.et4ae5__softbounce__c, 
                NEW.name, 
                NEW.lastmodifieddate, 
                NEW.et4ae5__opened__c, 
                NEW.ownerid, 
                NEW.et4ae5__subjectline__c, 
                NEW.isdeleted, 
                NEW.et4ae5__contact__c, 
                NEW.systemmodstamp, 
                NEW.lastmodifiedbyid, 
                NEW.et4ae5__datesent__c, 
                NEW.et4ae5__dateunsubscribed__c, 
                NEW.createddate, 
                NEW.createdbyid, 
                NEW.et4ae5__lead__c, 
                NEW.et4ae5__tracking_as_of__c, 
                NEW.et4ae5__numberofuniqueclicks__c, 
                NEW.et4ae5__senddefinition__c, 
                NEW.et4ae5__mergeid__c, 
                NEW.et4ae5__triggeredsenddefinition__c, 
                NEW.sfid, 
                NEW.id, 
                NEW._hc_lastop, 
                NEW._hc_err);
            END IF;
            RETURN NULL;
       END;

Я добавил строку в логи c который проверяет, существует ли этот идентификатор в другой таблице, но я не уверен, что это лучший способ его обработать?

AND NEW.id NOT IN (SELECT id FROM archive.individualemailresult__c)) -- this seems expensive

...