如何解决返回的行结构与触发table的结构不匹配?
How to solve returned row structure does not match the structure of the triggering table?
我已经将 varchar 数据类型长度的事务 table 列从 50 更改为 100。一旦我更改了列的长度.. 来自父 table 的触发器开始失败.. 一旦我放弃并创建触发器,从主 table 功能中删除一切正常。.不确定是什么问题..有什么理由吗?
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();
任何时候 table 具有触发器和视图等依赖对象的更改,都应重新编译依赖对象。这是因为数据库引擎直接从缓存中访问依赖对象的定义。
例如,在触发器的情况下,可以在更改父 table 之前和之后禁用和启用它们。或者您可以再次执行 alter trigger。
禁用:
ALTER TABLE mytable DISABLE TRIGGER mytrigger;
启用:
ALTER TABLE mytable ENABLE TRIGGER mytrigger;
我已经将 varchar 数据类型长度的事务 table 列从 50 更改为 100。一旦我更改了列的长度.. 来自父 table 的触发器开始失败.. 一旦我放弃并创建触发器,从主 table 功能中删除一切正常。.不确定是什么问题..有什么理由吗?
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();
任何时候 table 具有触发器和视图等依赖对象的更改,都应重新编译依赖对象。这是因为数据库引擎直接从缓存中访问依赖对象的定义。 例如,在触发器的情况下,可以在更改父 table 之前和之后禁用和启用它们。或者您可以再次执行 alter trigger。
禁用:
ALTER TABLE mytable DISABLE TRIGGER mytrigger;
启用:
ALTER TABLE mytable ENABLE TRIGGER mytrigger;