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

查找与Oracle表关联的序列和触发器,oracle,Oracle,我已使用此查询获取属于Oracle数据库用户的序列列表: SELECT * FROM all_sequences x,all_tables B WHERE x.sequence_owner=B.owner AND B.TABLE_NAME='my_table'; 但该数据库用户也有更多的序列,因此查询将返回数据库用户的所有序列。有谁能帮我用query找到my_table的特定序列,这样我就可以在我的应用程序中获得自动递增id了 我想要一个查询,它获取我的数据库用户的表列表以及表中使用的序列和触

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

SELECT * FROM all_sequences x,all_tables B
WHERE x.sequence_owner=B.owner AND B.TABLE_NAME='my_table';
但该数据库用户也有更多的序列,因此查询将返回数据库用户的所有序列。有谁能帮我用query找到
my_table
的特定序列,这样我就可以在我的应用程序中获得自动递增id了

我想要一个查询,它获取我的数据库用户的表列表以及表中使用的序列和触发器

您可以从
user\u triggers
视图中获取与表关联的触发器。然后,您可以在
user\u dependencies
中查找为这些触发器记录的任何依赖项,这些依赖项可能包括序列(包等)以外的对象,因此将这些依赖项连接到
user\u sequences
视图将只显示您感兴趣的那些

类似这样的情况,假设您正在查看自己的模式,并且您只对引用序列的触发器感兴趣(不一定要执行“自动递增”,但很可能是):

如果您实际上正在查看不同的模式,那么您需要使用
所有表
等,并对您要查找的用户的所有者列进行筛选和联接。如果您想包括没有触发器的表,或者没有引用序列的触发器,那么可以使用外部联接


版本查找不同的架构,但这假定您具有访问数据字典信息所需的权限-表等对您可见,但它们可能不可见:

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>';
选择tabs.table\u名称,
trigs.trigger\u名称,
序列名称
从所有表选项卡
加入所有的触发器
在trigs.table_owner=tabs.owner上
和trigs.table_name=tabs.table_name
加入所有依赖项dep
on deps.owner=trigs.owner
和deps.name=trigs.trigger\u name
按顺序连接所有_序列
在seqs.sequence_owner=deps.referenced_owner上
和seqs.sequence_name=deps.referenced_name
其中tabs.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>';
选择tabs.table\u名称,
trigs.trigger\u名称,
序列名称
从dba_表选项卡
加入dba_触发器触发器触发器
在trigs.table_owner=tabs.owner上
和trigs.table_name=tabs.table_name
加入dba_deps
on deps.owner=trigs.owner
和deps.name=trigs.trigger\u name
加入dba_序列序列
在seqs.sequence_owner=deps.referenced_owner上
和seqs.sequence_name=deps.referenced_name
其中tabs.owner='';

我找到了这个问题的解决方案,可以猜测特定序列的序列

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);

此查询将通过搜索使用sequence的字段的最大值和最大值+40(在我的情况下,缓存值是20,所以我将其设置为40)之间的序列值的最后一个数字来猜测。

一种方法是运行这些查询以检查是否有任何
sequence
的伪列(
NEXTVAL
CURRVAL
)用于
函数
过程
触发器
PL/SQL JAVA源代码

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

select * from all_source where 
         UPPER(TEXT) LIKE '%NEXTVAL%';  
然后转到特定的
过程、函数或触发器
,检查哪个列/表由序列填充。 该查询也可以与
'%CURRVAL%'

如果您是从
JDBC
或其他使用
序列的外部应用程序运行insert,这可能没有帮助


Oracle 12c引入了
IDENTITY
列,使用该列可以创建带有默认生成的IDENTITY列的表

CREATE TABLE t1 (c1 NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY, 
                   c2 VARCHAR2(10));
这将在内部创建一个
序列
,自动生成表列的值。因此,如果您想知道哪个序列为哪个表生成值,可以查询
所有选项卡列

SELECT data_default AS sequence_val
    ,table_name
    ,column_name
FROM all_tab_columns
WHERE OWNER = 'HR'
    AND identity_column = 'YES';

SEQUENCE_VAL                             |TABLE_NAME               |COLUMN_NAME
-----------------------------------------|-------------------------------------
"HR"."ISEQ$$_78160".nextval              |T1                       |C1

从sys.ALL_TAB_IDENTITY_COLS中选择SEQUENCE_NAME,其中owner='SCHEMA_NAME'和table_NAME='table_NAME'

序列不会直接链接到表,只能通过触发器或显式insert语句(可能在存储过程/包中)间接链接到表。既然你提到了“自动递增”,你大概是在寻找一个设定值的触发器;但是你不需要知道,ID会在后台自动设置。除非您有一个将序列名与表名相关联的命名约定,否则您需要搜索触发器代码(在
all\u source
中),如果它对您可见,并计算出表格式-可能更容易询问其他用户-实际上,我想要查询我的数据库用户的表列表以及表中使用的序列和触发器。@user2492525,无法查询任何表使用的序列,因为Oracle在它们之间不保持连接。您的应用程序可能会使用触发器来填充ID,在这种情况下,Alex Poole的答案可能很有用;或者另一个应用程序可能根本不使用触发器并在应用程序代码中调用序列。底线是,您的问题没有通用的解决方案。@user2492525-那么您为什么要这样做呢?为什么不在联接中包含表/触发器/序列名称?我刚刚联接了所有这些,但我的序列名称与触发器名称不同,因此它不会返回任何名称value@user2492525-我不知道为什么会出现这个问题,我链接的SQL FIDLE有不同的名称。您只需要在每个阶段加入适当的名称。我自己通过使用触发器体解决了这个问题,该触发器体具有序列名称。使用编程,我拆分了序列名称并获得了它。感谢大家帮助我很快完成了我的工作。回顾:对于堆栈溢出,不鼓励使用代码答案,因为它们没有解释它是如何解决问题的。请编辑您的答案,以解释此代码的作用以及如何回答
SELECT data_default AS sequence_val
    ,table_name
    ,column_name
FROM all_tab_columns
WHERE OWNER = 'HR'
    AND identity_column = 'YES';

SEQUENCE_VAL                             |TABLE_NAME               |COLUMN_NAME
-----------------------------------------|-------------------------------------
"HR"."ISEQ$$_78160".nextval              |T1                       |C1