Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何访问将在触发器中使用的存储过程中的列PostgreSQL_Sql_Postgresql_Function_Stored Procedures_Triggers - Fatal编程技术网

如何访问将在触发器中使用的存储过程中的列PostgreSQL

如何访问将在触发器中使用的存储过程中的列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

我试图访问一个函数(=存储过程)中表tb_client_cdc的一列,该函数将由触发器调用,以存储应用于表tb_client的操作(更新、插入、删除)的最后状态

如果我们在tb_client中插入一行,并且该行存在于tb_client_cdc中,则不必再插入另一行,而是必须更新该行

因此,为了检测行是否存在,我使用:

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;