查找虚拟列表达式引用的列

Hor*_*ndo 6 oracle virtual-columns

有谁知道任何包含“真实”列到虚拟列的引用的 Oracle 字典视图?

例如,假设我有一个这样的表:

create table t (
 c1 varchar2(5)
 ,c2 as (c1 || '*')
 )
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种确定 c1 具有 c2 依赖项的方法(不尝试解析 user_tab_cols.data_default)。我正在编写一个模式同步工具,我正在尝试弄清楚我需要做什么才能将表与执行最少工作的“模型”同步。如果模型显示上表中的 c1 从 varchar2(5) 更改为 varchar2(6),我希望能够确定我需要执行以下操作:

alter table t modify( c2 as ( null ) );
alter table t modify( c1 varchar2(6) );
alter table t modify( c2 as ( c1 || '*' ) );
Run Code Online (Sandbox Code Playgroud)

并避免使用 ORA-54031。

[编辑]

似乎我在解释我的问题时不够清楚,所以这里是。

当我们的开发人员开始处理错误时,他们会创建应用程序的 git 分支以及填充了主 git 分支内容的数据库模式。在处理 bug 时,开发人员可能会进行 DML 更改或偶尔会进行 DDL 更改(当然还有代码更改)。一旦他们的 bug 完成并被审查,他们的 git 分支就会与 master 合并。同步工具允许对数据库模式进行完整的“差异”——从内容和结构的角度来看。这构成了审查的一部分。开发人员使用同步工具生成其架构的导出,此导出是分支的一部分。在 bug 分支合并到 master 之后,master 数据库模式从开发人员完成的导出中同步。

是的,脚本将是解决问题的一种方法,但它需要一定程度的纪律,而这并非所有开发人员都具备。同步工具目前处理我概述的场景,但 imo 有点笨拙。我问我最初的问题的原因是,如果我能够通过字典视图确定真实列和虚拟列之间的关系,我的工具生成的同步 sql 将更加“外科手术”。

谢谢。

小智 2

User_tab_cols 显示当 virtual_column 包含“YES”时存在依赖性,这满足了您确定是否存在任何依赖性的需要。

为了确定实际的虚拟列由什么组成,仍然需要解析 data_default。

SELECT column_name , virtual_column , segment_column_id , internal_column_id FROM user_tab_cols WHERE table_name = 'T' ORDER BY column_id;