【问题标题】:How to solve returned row structure does not match the structure of the triggering table?如何解决返回的行结构与触发表的结构不匹配?
【发布时间】:2018-07-29 19:38:04
【问题描述】:

我已将 varchar 数据类型长度的事务表列从 50 更改为 100。一旦我更改了列的长度.. 来自父表的触发器开始失败.. 一旦我删除并创建触发器,从主表函数中删除所有内容工作正常..不确定是什么问题..有什么理由吗?

Detail: Returned type character varying(50) does not match expected type character varying(100) in column 15.

CREATE FUNCTION customer_delete_master()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF 
     AS $BODY$

DECLARE
    r customer%rowtype;
BEGIN
    DELETE FROM ONLY customer where customer_id = new.customer_id returning * into r;
    RETURN r;
end;

$BODY$;

更新 1:

CREATE TABLE customer
(
    customer_id character varying(10),
    firstname character varying(100),
    lastname character varying(50),
    CONSTRAINT customer_pkey PRIMARY KEY (customer_id)
);

CREATE TRIGGER after_insert_customer_trigger
    AFTER INSERT
    ON customer
    FOR EACH ROW
    EXECUTE PROCEDURE customer_delete_master();

【问题讨论】:

  • 如果您也发布了表格的 DDL,这将有助于理解这一点。包括CREATE TRIGGER 声明。
  • @stickybit 我已经更新了详情

标签: sql postgresql database-trigger


【解决方案1】:

任何时候更改具有依赖对象(如触发器和视图)的表时,都应重新编译依赖对象。这是因为数据库引擎直接从缓存中访问依赖对象的定义。 例如,在触发器的情况下,可以在更改父表之前和之后禁用和启用它们。或者您可以再次执行更改触发器。

禁用:

ALTER TABLE mytable DISABLE TRIGGER mytrigger;

启用:

ALTER TABLE mytable ENABLE TRIGGER mytrigger;

【讨论】:

  • 我试过 DISABLE 和 ENABLE.. 但这无济于事...但删除和创建触发器和过程(函数)都有效..
  • 是的,关键是依赖对象应该重新编译。通过删除和创建,触发器的定义被更新并且数据库引擎缓存被覆盖。最好有一个过程来确定最关键表的任何依赖对象。这里有一些好主意stackoverflow.com/questions/4462908/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-10
  • 2016-06-14
  • 1970-01-01
  • 2014-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多