【问题标题】:Is there a clean way to get table-trigger-column-sequence relation?有没有一种干净的方法来获得表-触发-列-序列关系?
【发布时间】:2010-10-26 16:24:45
【问题描述】:

我已经构建了一个“最佳猜测”查询来获取序列的相关 table.column。有没有更好、更简洁的方法来获得这种关系?

select ut.table_name, ut.table_owner, ut.trigger_name, us.sequence_name 
  ,upper(dbms_metadata.get_ddl('TRIGGER', ut.trigger_name, ut.table_owner
)) triger_ddl
  ,to_char(regexp_substr(
     upper(dbms_metadata.get_ddl('TRIGGER', ut.trigger_name, ut.table_owner))
    ,'.*(;|BEGIN)[^;]*' || us.sequence_name || '.NEXTVAL[^;]*;.*'
  )) sequence_stmt
  ,regexp_substr(
     to_char(regexp_substr(
        upper(dbms_metadata.get_ddl('TRIGGER', ut.trigger_name, ut.table_owner))
       ,'.*;|BEGIN[^;]*' || us.sequence_name || '.NEXTVAL[^;]*;.*'
     ))
    ,'(INTO[[:blank:]]*)*:NEW\.([[:alpha:]]+|"[^"]+")([[:blank:]]*:=)*'
  ) sequence_column
from user_triggers ut
    ,user_dependencies ud
    ,user_sequences us
  where UD.NAME = ut.trigger_name 
  and   ud.type = 'TRIGGER'
  and   UD.REFERENCED_NAME = us.sequence_name
  and   UD.REFERENCED_TYPE = 'SEQUENCE'

我需要这个用于确定插入过程的默认值的表 api code_generator。

【问题讨论】:

  • 序列生成列是否总是主键?
  • 如果您正在编写 TAPI 代码生成器,最好的办法是设计并强制执行序列的命名约定 - 然后让所有设计人员和开发人员同意遵守它。

标签: sql oracle plsql oracle11g


【解决方案1】:

不幸的是,答案是否定的。 Oracle中没有序列和表列之间关系的概念。

获得它的唯一半可靠方法是查看源代码(不仅是触发器,还包括任何插入的代码)。您还可以根据序列的下一个值进行有根据的猜测,该值应该(如果一切按预期工作)略高于表列中的最大值。

如果幸运的话,列和序列已使用一致的约定命名,例如“MYTABLE.MY_ID”总是由一个名为“MY_ID_SEQ”的序列填充。但不能保证有人没有违反约定。

【讨论】:

  • 太可惜了……好吧,那我就做个表格,所有的开发者都必须添加他们的表格、列、序列关系。对于第一次迁移,他们可以使用我的“最佳猜测”查询。谢谢!
  • 有趣的方法 - 我猜你可以这样做 - 也许你甚至可以使用 DDL 触发器强制执行它(即不能创建序列,除非它已经在你的表中) - 不确定是否这是个好主意,或者不是! - 但我个人更喜欢强制执行命名约定。无论如何,最终取决于如何审查更改和执行标准。
猜你喜欢
  • 2011-07-28
  • 2022-08-11
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 2011-06-12
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多