gpt4 book ai didi

postgresql - 将 UPDATE 传播到动态确定的表

转载 作者:行者123 更新时间:2023-11-29 14:00:48 24 4
gpt4 key购买 nike

在 PostgreSQL 中,我创建了触发器过程来执行一些验证并在插入或更新表中的行之前执行一些查询。对于插入操作,我的触发器运行良好,所以我正在执行一些查询,但对于更新我无法执行查询。

CREATE FUNCTION RECORDS_VALIDATE() RETURNS TRIGGER AS $$
DECLARE
tblVar text := dynamically im creating table name;
BEGIN
IF NEW.date <= CURRENT_DATE THEN
RAISE NOTICE 'DATE IS LESS THAN THE CURRENT DATE';
RETURN NULL;
END IF;

IF (TG_OP = 'UPDATE') THEN
EXECUTE 'UPDATE '|| tblVar || ' SET id = $1,date = $2 where id = $3'
USING NEW.id,NEW.date,OLD.id;
RETURN NULL;
END IF;
IF(TG_OP = 'INSERT') THEN
EXECUTE 'INSERT INTO ' || tblVar || ' VALUES($1,$2)'
USING NEW.id, NEW.date;
RETURN NULL;
END IF;
END;
$$ LANGUAGE plpgsql;

触发器

CREATE TRIGGER RECORDS BEFORE INSERT OR UPDATE ON RECORDS
FOR EACH ROW EXECUTE PROCEDURE RECORDS_VALIDATE();

注意: RECORDS 是我的基表,来自这个基表名称我正在动态创建表所以我不想在 RECORDS 中插入行这就是为什么我返回 NULL 我需要在新创建的表中插入行所以使用执行命令我' m 运行查询以在新创建的表中插入行。

插入
这将在新创建的表中插入行,而不是在 RECORDS 中

INSERT INTO BILLING_RECORDS VALUES(1,date '2013-10-15');

更新
运行此行时未在新创建的表中更新。也没有给出错误。我得到的输出为 UPDATE 0

UPDATE RECORDS SET id = 10,date = date '2013-12-30' where id=1;

最佳答案

我假设您正在此处构建分区自动化触发器。我最近一直在研究完全相同的问题。

  1. 仅对您的 表使用ON INSERT 触发器(我想是记录)。

    此触发器会将记录移动到所需 分区。

  2. 对于 ON UPDATE 部分,将触发器添加到您的 base 表没有任何意义,因为您的设计是空的。相反,您应该为您正在使用的每个分区 创建这样一个触发器,如果​​您动态创建它们,那么您应该确保每个这样的分区都有它自己的触发器。不过,它们都可以共享一个功能。

还有一点要记住。当您更新作为分区键的列时,您必须格外小心:

  • 如果您使用CHECK 约束来限制分区内的键范围,您将获得异常;
  • 如果不进行检查,您最终可能会得到一个困惑的数据布局。

因此,如果新值对应于不同的分区,而不是分区键列UPDATE,您应该DELETE + INSERT 代替。

另一种方法是完全限制对分区键列的更改。你可以做到:

  • 在触发器中,比较OLDNEW值;
  • 仅为那些不属于您的分区键的列授予 UPDATE 权限。

关于postgresql - 将 UPDATE 传播到动态确定的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19315565/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com