如何访问将在触发器中使用的存储过程中的列PostgreSQL
我试图访问一个函数(=存储过程)中表tb_client_cdc的一列,该函数将由触发器调用,以存储应用于表tb_client的操作(更新、插入、删除)的最后状态 如果我们在tb_client中插入一行,并且该行存在于tb_client_cdc中,则不必再插入另一行,而是必须更新该行 因此,为了检测行是否存在,我使用:如何访问将在触发器中使用的存储过程中的列PostgreSQL,sql,postgresql,function,stored-procedures,triggers,Sql,Postgresql,Function,Stored Procedures,Triggers,我试图访问一个函数(=存储过程)中表tb_client_cdc的一列,该函数将由触发器调用,以存储应用于表tb_client的操作(更新、插入、删除)的最后状态 如果我们在tb_client中插入一行,并且该行存在于tb_client_cdc中,则不必再插入另一行,而是必须更新该行 因此,为了检测行是否存在,我使用: IF ((TG_OP = 'INSERT') AND (sale_cdc.tb_client_cdc.saleclient_code <> NEW.client_cod
IF ((TG_OP = 'INSERT') AND (sale_cdc.tb_client_cdc.saleclient_code <> NEW.client_code)) THEN
- 作用
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...
^
或:
声明一个包含
client\u代码的变量,并在开头检查它是否存在于tb\u client\u cdc
中,如下所示:
CREATE OR REPLACE FUNCTION update_tb_client_cdc() RETURNS TRIGGER AS
$$
DECLARE
p_client_code tb_client.client_code%TYPE;
BEGIN
SELECT client_code FROM tb_client_cdc WHERE client_code = NEW.client_code
INTO p_client_code;
IF TG_OP = 'INSERT' AND p_client_code IS NULL THEN
INSERT INTO tb_client_cdc VALUES(NEW.*, 'I', user, now());
RETURN NEW;
ELSEIF TG_OP = 'INSERT' AND p_client_code IS NOT NULL THEN
UPDATE 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;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
如果要在插入到tb\u client
时将行插入到tb\u client
中,那么tb\u cdc
表中如何不存在行?另外,您在tb\u client\u cdc
上的主键毫无意义,每个客户端只能有一行,我假设您希望此表成为某种操作日志。谢谢@MarcinJ!!!!是的,我没有在我的数据库上创建模式,只是直接使用了public
,对不起。很高兴我能帮忙!有人能解释一下,在postgreSQL中,运算符“:”是否也可以这样做吗?如果答案是肯定的,你能告诉我怎么做吗?
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...
^
CREATE OR REPLACE FUNCTION update_tb_client_cdc() RETURNS TRIGGER AS
$$
DECLARE
p_client_code tb_client.client_code%TYPE;
BEGIN
SELECT client_code FROM tb_client_cdc WHERE client_code = NEW.client_code
INTO p_client_code;
IF TG_OP = 'INSERT' AND p_client_code IS NULL THEN
INSERT INTO tb_client_cdc VALUES(NEW.*, 'I', user, now());
RETURN NEW;
ELSEIF TG_OP = 'INSERT' AND p_client_code IS NOT NULL THEN
UPDATE 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;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;