Функция запуска postgresql - дубликаты или отсутствующие данные - PullRequest
0 голосов
/ 08 марта 2012

БД postgresql 9.1 записывает данные, которые автоматически отправляются с компьютера. Это отлично работает.

У меня есть триггер AFTER INSERT ... FOR EACH ROW - это тоже работает. Триггер работает, просматривая другую таблицу, и, если в поле есть значение, он срабатывает.

У меня две проблемы - а. Некоторые машины отправляют более 1 результата. Я использую LIMIT 1 для предотвращения дублирования, и это означает, что я пропускаю данные с машины, которая отправляет более одного результата. Какая альтернатива этому? б. Некоторые машины используют один и тот же тестовый код, и я не могу найти способ его квалифицировать, чтобы сделать его специфичным для машины в SELECT при использовании значения NEW Вот код

CREATE FUNCTION testcode_matches()
    RETURNS TRIGGER as $$
DECLARE
    var INTEGER;
    name text;
    short text;
    id integer;
BEGIN
    SELECT count("TestID") from testcode WHERE "testcode"."Parameter" = NEW."Parameter" into var;
    IF var > 0 THEN
        SELECT "TestName", "ShortTestName", "TestID" 
        from testcode where "Parameter" = NEW."Parameter" Limit 1 into name, short, id;

        INSERT INTO finaldata /* various fields */
        SELECT /* various fields */ name, short, id
        from obx 
        WHERE "obx"."Parameter" = NEW."Parameter"
        LIMIT 1;
    END if;
    RETURN NEW;
END;
$$ language plpgsql;

1 Ответ

0 голосов
/ 08 марта 2012

Версия на языке SQL, без всяких переменных переменных.(неизвестные детали опущены или угаданы) (не проверено)

CREATE FUNCTION testcode_matches()
    RETURNS TRIGGER as $meat$
BEGIN

    INSERT INTO finaldata ( name, short, id /* various fields */ )
    SELECT tc.name, tc.shorttestname, tc.id /* various fields */
    FROM testcode tc
    JOIN obx ON obx.parameter = tc.parameter
    WHERE tc.parameter = NEW.parameter
    AND tc.id = NEW.id -- is this the PK for testcode ??
                ;
    RETURN NEW;
END;
$meat$ language sql;

ОБНОВЛЕНИЕ:

set search_path='tmp';

DROP TABLE obx CASCADE;
CREATE TABLE obx
        ( parameter INTEGER NOT NULL PRIMARY KEY
        );

DROP TABLE testcode CASCADE;
CREATE TABLE testcode
        ( ID INTEGER NOT NULL PRIMARY KEY
        , parameter INTEGER NOT NULL  REFERENCES obx(parameter)
        , zname VARCHAR
        , shorttestname VARCHAR
        );

DROP TABLE finaldata CASCADE;
CREATE TABLE finaldata
        ( ID INTEGER NOT NULL PRIMARY KEY
        , zname VARCHAR
        , shorttestname VARCHAR
        );


DROP FUNCTION testcode_matches();
CREATE FUNCTION testcode_matches()
    RETURNS TRIGGER
    AS $meat$
BEGIN

    INSERT INTO finaldata ( id, zname, shorttestname /* various fields */ )
    SELECT tc.id, tc.zname, tc.shorttestname /* various fields */
    FROM testcode tc
    JOIN obx ON obx.parameter = tc.parameter
    WHERE tc.parameter = NEW.parameter
    AND tc.id = NEW.id -- is this the PK for testcode ??
                ;
    RETURN NEW;
END;
$meat$ language plpgsql;

DROP TRIGGER testcode_ins;
CREATE TRIGGER testcode_ins
        AFTER INSERT ON testcode
        FOR EACH ROW
        EXECUTE PROCEDURE testcode_matches()
        ;
...