Для Postgresql --- и, в конечном счете, для Sybase ADS --- у меня есть таблицы, которые будут реплицироваться с помощью самодельных триггеров. У триггеров есть функция, которая должна записывать информацию об изменениях INSERT UPDATE DELETE, включая операцию I/U/D и идентификатор измененной строки. Я использую тестовые таблицы со столбцом имени и автоматически увеличивающимся идентификатором для проверки двунаправленной репликации.
Если я сделаю вставку в таблицу NAME, например, добавлю «JOHN» с автоматическим идентификатором «1», смогу ли я вставить это значение идентификатора и даже, возможно, «JOHN» в таблицу журнала? Я смотрю на варианты OLD.ID или NEW.ID, но я не знаю, как это может работать. Мой код триггера/функции:
CREATE OR REPLACE FUNCTION Insert() RETURNS TRIGGER AS $ReplInsert$
BEGIN
IF (TG_OP = 'DELETE') THEN
INSERT INTO "log" ("Operation","ID","NAME")
VALUES ('DELETE', OLD.ID, OLD.NAME);
RETURN OLD;
ELSIF (TG_OP = 'UPDATE') THEN
INSERT INTO "log" ("Operation","ID","NAME")
VALUES ('UPDATE', NEW.ID ,NEW.NAME);
RETURN NEW;
ELSIF (TG_OP = 'INSERT') THEN
INSERT INTO "log" ("Operation","ID","NAME")
VALUES ('UPDATE', NEW.ID , NEW.NAME);
RETURN NEW;
END IF;
RETURN NULL;
END;
$ReplInsert$ LANGUAGE plpgsql;
CREATE TRIGGER logTrg
AFTER INSERT OR UPDATE OR DELETE ON "FIRST_NAME"
FOR EACH ROW EXECUTE PROCEDURE Insert();
В конечном итоге это делается для двунаправленной репликации с использованием триггеров. Спасибо за любое внимание или рекомендации. Буду редактировать по мере необходимости.
@Nate Извините, опечатка с моей стороны. отредактировано. В моем коде не было кавычек вокруг записей NEW и OLD NAME и ID; просто значения операции. Я все еще получаю ОШИБКУ: запись «новая» не имеет поля «id», которое я устраняю. Спасибо.
Я смог решить эту проблему, изменив AFTER на BEFORE в триггере, который, как я сначала полагал, не сработает, или:
CREATE OR REPLACE FUNCTION Insert() RETURNS TRIGGER AS $ReplInsert$
BEGIN
IF (TG_OP = 'DELETE') THEN
INSERT INTO "log" ("Operation","ID","NAME")
VALUES ('DELETE', OLD.ID, OLD.NAME);
RETURN OLD;
ELSIF (TG_OP = 'UPDATE') THEN
INSERT INTO "log" ("Operation","ID","NAME")
VALUES ('UPDATE', NEW.ID ,NEW.NAME);
RETURN NEW;
ELSIF (TG_OP = 'INSERT') THEN
INSERT INTO "log" ("Operation","ID","NAME")
VALUES ('UPDATE', NEW.ID , NEW.NAME);
RETURN NEW;
END IF;
RETURN NULL;
END;
$ReplInsert$ LANGUAGE plpgsql;
CREATE TRIGGER logTrg
BEFORE INSERT OR UPDATE OR DELETE ON "FIRST_NAME"
FOR EACH ROW EXECUTE PROCEDURE Insert();
Не заключайте в кавычки старые и новые значения, которые вы хотите вставить. Если вы поместите их в кавычки, вы буквально вставите строку «NEW.ID» вместо нового идентификатора.