Postgres 复合类型 drop cascade 仅删除依赖列
Postgres composite type drop cascade removes dependant columns only
(使用下面的示例代码...)我一直困惑地执行一些(可重新执行的)脚本(holding/versioning 源代码回购中的数据库逻辑)说明确定义的列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)
outcommented(原样):
(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
很明显,修复 是 执行逻辑现在必须在 foo.sql
之前执行 bar.sql
,但是 错误非常奇怪并且具有误导性 ,因为人们不会期望像这样删除列 foo.foo_b
,但是依赖类型 foo
应该被删除。
(使用下面的示例代码...)我一直困惑地执行一些(可重新执行的)脚本(holding/versioning 源代码回购中的数据库逻辑)说明确定义的列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)
outcommented(原样):
(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
很明显,修复 是 执行逻辑现在必须在 foo.sql
之前执行 bar.sql
,但是 错误非常奇怪并且具有误导性 ,因为人们不会期望像这样删除列 foo.foo_b
,但是依赖类型 foo
应该被删除。