这个查询触发器有什么问题?

时间:2018-04-18 20:43:32

标签: sql postgresql plpgsql database-trigger

我想创建一个触发器来记录表中的以下更改" osoba" (列中的更改"登录")

我有这张桌子" osoba":

item_day_count_v3=item_day_group['PriceDiff_pct'].agg([('Count', 'count'), ('Pos_Return', lambda val: (val > 0).sum()), ('Neg_Return', lambda val: (val < 0).sum()), ('Mean', 'mean'), ('Median', 'median'), ('25%Percntile', percentile(25)), ('75%Percntile', percentile(75)), ('Max', 'max)]).reset_index()

和这个日志表

CREATE TABLE Osoba (
  id_osoba SERIAL NOT NULL UNIQUE,
  login VARCHAR,
  jmeno VARCHAR,
  prijmeni VARCHAR,
  heslo_hash VARCHAR,
)

具有以下功能:

    CREATE TABLE osoba_zmeny(
    operace         char(1)   NOT NULL,
    cas_otisk       timestamp NOT NULL,
    id_osoba        integer   NOT NULL,
    login           text      NOT NULL,
);

CREATE TRIGGER - 查询成功返回,但如果我想在表格中插入记录&#34; Osoba&#34;,则返回:

CREATE OR REPLACE FUNCTION osoba_zmeny() RETURNS TRIGGER AS $osoba_zmeny$
    BEGIN
        IF (TG_OP = 'DELETE') THEN
            INSERT INTO osoba_zmeny SELECT 'D', now(), id_osoba, OLD.login;
            RETURN OLD;
        ELSIF (TG_OP = 'UPDATE') THEN
            INSERT INTO osoba_zmeny SELECT 'U', now(), id_osoba, NEW.login;
            RETURN NEW;
        ELSIF (TG_OP = 'INSERT') THEN
            INSERT INTO osoba_zmeny SELECT 'I', now(), id_osoba, NEW.login;
            RETURN NEW;
        END IF;
        RETURN NULL;
    END;
$osoba_zmeny$ LANGUAGE plpgsql;

DROP TRIGGER IF EXISTS osoba_zmeny on osoba;
CREATE TRIGGER osoba_zmeny
AFTER INSERT OR UPDATE OR DELETE ON osoba
    FOR EACH ROW EXECUTE PROCEDURE osoba_zmeny();
你知道我做错了什么吗?谢谢你的帮助

1 个答案:

答案 0 :(得分:1)

为什么select使用INSERT?并且正如错误消息所示,id_osoba无法在没有表的情况下被引用。您需要从NEWOLD记录中获取该记录,具体取决于触发器的类型,例如:

INSERT INTO osoba_zmeny SELECT 'D', now(), id_osoba, OLD.login;

应该是

INSERT INTO osoba_zmeny values ('D', now(), old.id_osoba, OLD.login);

第二个选择

相同