(使用下面的示例代码...)我一直困惑地执行一些(可重新执行的)脚本(在源代码仓库中保存/版本化db逻辑),说明了一个明确定义的列foo.foo_b
不存在虽然它已在脚本中成功执行。
测试代码显示:
-- foo.sql type script
drop type if exists foo cascade ;
create type foo as (
--foo_b bar, -- (a) not there in first script version
foo_c char
) ;
-- bar.sql type script
drop type if exists bar cascade ;
create type bar as (
bar_i int
) ;
-- simple sample code that may cause the strange error
select (null::foo).* ;
--select (null::foo).foo_b ; -- (a) not there in first script version
执行脚本(a)
已经过时(按原样):
(0 rows affected)
(0 rows affected)
(0 rows affected)
(0 rows affected)
foo_c
-----
-
(0 rows affected)
使用我们正在使用的新foo_b
列执行脚本(从以上2 --
标记的行中移除评论(a)
前缀:
(0 rows affected)
(0 rows affected)
(0 rows affected)
(0 rows affected)
foo_c
-----
-
(0 rows affected)
ERROR: column "foo_b" not found in data type foo
Position: 9
我原来的sql不同,实际上导致了同样原因的另一个错误:
select row( null::bar, 'xxx' )
ERROR: cannot cast type record to foo
Detail: Input has too many columns.
Position: 7818
答案 0 :(得分:0)
很明显,修复是执行逻辑现在必须在bar.sql
之前执行foo.sql
,但错误很奇怪并且误导,因为人们不会期望像这样删除列foo.foo_b
,但应该删除依赖类型foo
。