【发布时间】:2019-09-02 13:19:57
【问题描述】:
我正在尝试访问将由触发器调用的函数(= 存储过程)内表 tb_client_cdc 的列,以存储应用的操作(更新、插入、删除)的最后状态到表 tb_client。
如果我们在 tb_client 中进行 INSERT 并且该行存在于 tb_client_cdc 中,我们不必插入另一行,相反,我们必须更新该行。
所以,为了检测该行是否存在,我使用了:
IF ((TG_OP = 'INSERT') AND (sale_cdc.tb_client_cdc.saleclient_code <> NEW.client_code)) THEN
我尝试使用 "sale_cdc.tb_client_cdc.saleclient_code" 而不是 sale_cdc.tb_client_cdc.saleclient_code ,但这并没有解决我的问题。
- 表格
CREATE TABLE sale.tb_client
(
client_code CHAR(5) NOT NULL ,
client_name CHARACTER VARYING(40) NOT NULL ,
address CHARACTER VARYING(140) ,
city CHARACTER VARYING(25) ,
country CHARACTER VARYING(60) NOT NULL ,
contact_email CHARACTER VARYING(100) ,
phone CHARACTER VARYING(15) ,
parent_client_code CHAR(5) ,
created_by_user CHARACTER VARYING(10) NOT NULL DEFAULT 'OS_SYSTEM',
created_date DATE ,
updated_date DATE ,
CONSTRAINT pk_client PRIMARY KEY (client_code) ,
CONSTRAINT fk_client_parent FOREIGN KEY (parent_client_code)
REFERENCES sale.tb_client (client_code)
);
CREATE TABLE sale_cdc.tb_client_cdc
(
client_code CHAR(5) NOT NULL ,
client_name CHARACTER VARYING(40) NOT NULL ,
address CHARACTER VARYING(120) ,
city CHARACTER VARYING(25) ,
country CHARACTER VARYING(50) NOT NULL ,
contact_email CHARACTER VARYING(100) ,
phone CHARACTER VARYING(15) ,
parent_client_code CHAR(5) ,
created_by_user CHARACTER VARYING(10) NOT NULL DEFAULT 'OS_SYSTEM',
created_date DATE ,
updated_date DATE ,
operation CHAR(1) NOT NULL ,
user_id CHARACTER VARYING(10) NOT NULL ,
operation_timestamp TIMESTAMP(6) WITHOUT TIME ZONE NOT NULL , --timestamp [ (p) ] [ without time zone ]
CONSTRAINT pk_client PRIMARY KEY (client_code) ,
CONSTRAINT fk_client_parent FOREIGN KEY (parent_client_code)
REFERENCES sale_cdc.tb_client_cdc (client_code)
);
- 功能
CREATE OR REPLACE FUNCTION update_tb_client_cdc() RETURNS TRIGGER AS
$$
BEGIN
IF ((TG_OP = 'INSERT') AND (sale_cdc.tb_client_cdc.saleclient_code <> NEW.client_code)) THEN
INSERT INTO sale_cdc.tb_client_cdc VALUES(NEW.*, 'I', user, now());
RETURN NEW;
END IF;
ELSIF ((TG_OP = 'INSERT') AND (sale_cdc.tb_client_cdc.client_code = NEW.client_code)) THEN
UPDATE sale_cdc.tb_client_cdc
SET client_name = NEW.client_name,
address = NEW.address,
city = NEW.city,
country = NEW.country,
contact_email = NEW.contact_email,
phone = NEW.phone,
parent_client_code = NEW.parent_client_code,
created_by_user = NEW.created_by_user,
created_date = NEW.created_date,
updated_date = NEW.updated_date,
operation = 'I',
user_id = user,
operation_timestamp = now()
WHERE client_code = NEW.client_code;
IF NOT FOUND THEN RETURN NULL;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
- 触发
CREATE TRIGGER tr_client
AFTER INSERT OR UPDATE OR DELETE ON sale.tb_client
FOR EACH ROW EXECUTE PROCEDURE update_tb_client_cdc();
错误是:
ERROR: missing an entry for the table «tb_client_cdc» in the clause FROM
LINE 1: SELECT (((TG_OP = 'INSERT') AND (sale_cdc.tb_client_cdc.clie...
^
或者:
ERROR: there is no column «sale_cdc.tb_client_cdc.client_code»
LINE 1: SELECT (((TG_OP = 'INSERT') AND ("sale_cdc.tb_client_cdc.cli...
^
【问题讨论】:
-
如果您想在插入
tb_client时将其插入tb_client_cdc表中怎么会不存在?此外,tb_client_cdc上的主键毫无意义,每个客户端只能有一行,我假设您希望此表成为某种操作日志。
标签: sql postgresql function stored-procedures triggers