查找与Oracle表关联的序列和触发器

时间:2013-06-17 08:09:06

标签: oracle

我使用此查询来获取属于Oracle数据库用户的序列列表:

SELECT * FROM all_sequences x,all_tables B
WHERE x.sequence_owner=B.owner AND B.TABLE_NAME='my_table';

但是该数据库用户也有更多序列,因此查询返回数据库用户的所有序列。任何人都可以帮助我使用查询找到my_table的特定序列,以便我可以在我的应用程序中获取自动增量ID。

4 个答案:

答案 0 :(得分:8)

  

我想查询我的数据库用户表的列表以及表中使用的序列和触发器

您可以从user_triggers视图中获取与表格关联的触发器。然后,您可以在user_dependencies中查找为这些触发器记录的任何依赖项,其中可能包含序列(包等)以外的对象,因此将这些依赖项加入user_sequences视图只会向您显示有兴趣。

这样的事情,假设你正在查看自己的模式,并且你只对引用序列的触发器感兴趣(它们不一定是'自动增量',但很可能是):

select tabs.table_name,
  trigs.trigger_name,
  seqs.sequence_name
from user_tables tabs
join user_triggers trigs
  on trigs.table_name = tabs.table_name
join user_dependencies deps
  on deps.name = trigs.trigger_name
join user_sequences seqs
  on seqs.sequence_name = deps.referenced_name;

SQL Fiddle demo

如果您实际上在查看其他架构,则需要使用all_tables等,并在您要查找的用户的所有者列上过滤和加入。如果你想要包含没有触发器的表,或者没有引用序列的触发器,你可以使用外连接。


寻找不同架构的版本,虽然这假设您拥有访问数据字典信息所必需的权限 - 表格等对您来说是可见的,它们可能不是:

select tabs.table_name,
  trigs.trigger_name,
  seqs.sequence_name
from all_tables tabs
join all_triggers trigs
  on trigs.table_owner = tabs.owner
  and trigs.table_name = tabs.table_name
join all_dependencies deps
  on deps.owner = trigs.owner
  and deps.name = trigs.trigger_name
join all_sequences seqs
  on seqs.sequence_owner = deps.referenced_owner
  and seqs.sequence_name = deps.referenced_name
where tabs.owner = '<owner>';

如果看不到它们,那么你可能需要再次查看DBA视图,如果你有足够的权限:

select tabs.table_name,
  trigs.trigger_name,
  seqs.sequence_name
from dba_tables tabs
join dba_triggers trigs
  on trigs.table_owner = tabs.owner
  and trigs.table_name = tabs.table_name
join dba_dependencies deps
  on deps.owner = trigs.owner
  and deps.name = trigs.trigger_name
join dba_sequences seqs
  on seqs.sequence_owner = deps.referenced_owner
  and seqs.sequence_name = deps.referenced_name
where tabs.owner = '<owner>';

答案 1 :(得分:3)

我找到了解决这个问题的方法来猜测特定序列的序列

select * from SYS.ALL_SEQUENCES where SEQUENCE_OWNER='OWNER_NAME' and LAST_NUMBER between (select max(FIELD_NAME) from TABLE_NAME) and (select max(FIELD_NAME)+40 from TABLE_NAME);

此查询将通过搜索LAST_NUMBER来判断字段的MAX值与序列值之间的最大值+ 40(在我的情况下缓存值为20,所以我放40)

答案 2 :(得分:2)

一种方法是运行这些查询以检查sequence中是否使用了NEXTVAL个Pseudocolumns(CURRVALfunctions), procedurespackagesTriggersPL/SQL JAVA SOURCE

select * from user_source where 
         UPPER(TEXT) LIKE '%NEXTVAL%';   

select * from all_source where 
         UPPER(TEXT) LIKE '%NEXTVAL%';  

然后转到特定的Procedure, Function or Trigger以检查序列填充的列/表。 该查询还可以与'%CURRVAL%'

一起使用

如果您使用JDBCsequence或其他外部应用程序运行插入,这可能无济于事。

Oracle 12c引入了IDENTITY列,您可以使用这些列创建一个带有标识列的表,默认情况下会生成该列。

CREATE TABLE t1 (c1 NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY, 
                   c2 VARCHAR2(10));

这将在内部创建一个sequence,自动生成表格列的值。因此,如果您想知道哪个序列生成哪个表的值,您可以查询{ {1}}

all_tab_columns

答案 3 :(得分:0)

从 sys.ALL_TAB_IDENTITY_COLS 中选择 SEQUENCE_NAME,其中 owner = 'SCHEMA_NAME' and table_name = 'TABLE_NAME';