我们的 Oracle 环境已有大约 25 年的历史。这些年来,数据结构一直由许多(非 dba)程序员管理。多年来,数据完整性、命名标准、性能、元数据和总体关系数据库概念都没有被考虑在内。现在我们有数千个对象,它们被多个团队使用,影响多个应用程序、界面、任务和报告。我们正在以非常缓慢的速度解决所有这些问题。这个过程将包括更改列名、添加约束、触发器,甚至更改对象名称。人们不喜欢改变,所以建立一套新的标准和指导方针不是一朝一夕的事情。我希望建立对象的基线,对于表和视图,建立列数据。然后,我将构建一个自定义应用程序来帮助人们遵循这些新标准,尽可能“自动化”以确定他们缺少什么,以帮助这变得更加常规。这幅图的一小部分是跟踪对象何时被更改。考虑到需要额外的存储空间以及(即使是最小的)性能损失,我们不想仅仅为了这个目的而在我们的 Oracle 环境中启用审计。
综上所述,对于这个非常小的难题(虽然它不是那么重要,但足够重要,我想这样做),我试图跟踪列名是否发生变化。我无法通过键入列名来跟踪这些变化。我认为它不存在,但值得一试。我正在寻找 Oracle 中表/视图列的唯一标识符列。例如,DBA_OBJECTS.OBJECT_ID
是对象本身的唯一标识符,因此如果对象名称发生变化,我可以将其键入。
DBA_TABS_COLUMNS.COLUMN_ID
仅对特定表是唯一的,并且可以随着您删除列而更改。
如果大家有任何建议,可以纳入我正在采取的总体流程(使用表格、视图和应用程序进行自定义审计以管理变更),那么我愿意接受除审计和上述询问之外的其他建议。
谢谢您的帮助!
如果您想要类似
OBJECT_ID
对象或ROWID
行的伪列的东西,但对于列来说,COLUMN_ID
它是最接近的匹配,因为它是自动生成的,并且对于每个表都是唯一的。如果您想要所有表中唯一的一个键,则可以使用由以下任一组成的复合键:
schema_name.table_name.column_name
; 或者schema_name.table_name.column_id
。你说:
通常,列不会动态删除和重新创建,因此这不是您需要担心的问题。但是,如果您尝试保留唯一标识符,则需要在修改表定义时更新记录(这可能表明您正在做一些不寻常的事情,需要重新评估为什么要对数据库进行如此多的动态更改并尝试动态收集唯一列引用)。
关于问题的编辑:
它不存在于 Oracle 的数据字典中。
您可以通过名称或其唯一地引用表中的列,
COLUMN_ID
直到 DDL 语句重命名其中一列。在这种情况下,名称或COLUMN_ID
可能会发生变化。当列被重命名并且列的顺序发生变化时,没有自动生成的列可以跟踪该列。