2012-03-08 2 views
0

Postgresql 9.1 DB записывает данные, которые автоматически отправляются с машины. Это прекрасно работает.функция триггера postgresql - дубликаты или отсутствующие данные

У меня есть ПОСЛЕ ВСТАВКИ ... ДЛЯ КАЖДОГО СКОРОСТИ ROW - это также работает. Триггер работает, просматривая другую таблицу, и если есть значение в поле, которое он запускает.

У меня есть две проблемы - a. Некоторые машины отправляют более 1 результата. Я использую LIMIT 1 для предотвращения дубликатов, и это означает, что я пропускаю данные с машины, которая отправляет более одного результата. Что является альтернативой этому? b. На некоторых машинах используется один и тот же тестовый код, и я не могу найти способ его отработки, чтобы сделать его конкретным машиной в 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; 
+0

Вы ожидали более одного идентификатора из 'от testcode где "Параметр"= NEW "Параметр"' запроса.? В этом случае: LIMIT 1; вызывает случайный идентификатор, который будет извлечен (и вставлен в finaldata). IMHO вы можете поместить все {testcode, obx} в подзапрос и опустить все переменные. Запрос станет простым SQL. ASO: можете ли вы добавить определения таблиц и триггер, сам? – wildplasser

+0

Я получил еще один ответ, который помог мне, но мне интересно узнать о подзапросах. Можете ли вы предложить ссылку для меня, чтобы посмотреть? Сам триггер - Структура триггеров для таблицы «public». «Obx» - ---------------------------- CREATE TRIGGER «finaldata_matches» ПОСЛЕ ВСТАВКИ ON «public». «Obx» ДЛЯ КАЖДОГО РУКА ИСПОЛНИТЕЛЬНАЯ ПРОЦЕДУРА «testcode_matches»(); – user1044111

ответ

0

версия Plain-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; 

UPDATE:

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() 
     ; 
+0

Это была отличная помощь и разобрала первую проблему. Мне нужно проверить второй и его трудно сделать, если я не подключен к БД, которая получает данные данных от машин. Я должен был изменить язык. "[Err] ОШИБКА: SQL-функции не могут вернуть тип триггера", поэтому я изменился на "$ meat $ language plpgsql;" Вы поставили меня в правильном направлении - большое спасибо – user1044111

+0

Ваше право на функции SQL, которые не могут вернуть TRIGGER. (BTW в следующий раз **, пожалуйста, добавьте некоторые полезные вещи **, как определения таблиц и т. Д. На вопрос, и избегайте догадок.) – wildplasser

+0

Я почти там. Я узнал о функции CASCADE от вас, а также о другом способе записи триггерных функций. Я переделал работу с подробной информацией, спасибо за вашу помощь. – user1044111

Смежные вопросы