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

问题描述 投票:0回答:5

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

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

但是该数据库用户也有更多的序列,因此查询返回数据库用户的所有序列。任何人都可以帮助我使用查询找到

my_table
的特定序列,以便我可以在我的应用程序中获取自动增量 id。

oracle
5个回答
19
投票

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

您可以从

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 演示

如果您实际上正在查看不同的架构,那么您需要使用

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

8
投票

一种方法是运行这些查询来检查您的

sequence
NEXTVAL
CURRVAL
functions
 中是否使用了任何 
procedures
 的伪列(
packages
Triggers
PL/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%'

一起使用

如果您使用

JDBC
sequence
或其他外部应用程序运行插入,这可能没有帮助。


Oracle 12c 引入了

IDENTITY
列,您可以使用它创建带有默认生成的标识列的表。

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

这将在内部创建一个

sequence
,自动生成表列的值。因此,如果您想知道哪个序列为哪个表生成值,您可以查询
all_tab_columns

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

5
投票

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

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

此查询将通过搜索使用序列的字段的最大值和最大值 + 40 之间的序列值的 LAST_NUMBER 来猜测(在我的情况下,缓存值为 20,所以我输入 40)


1
投票

从 sys.ALL_TAB_IDENTITY_COLS 选择 SEQUENCE_NAME,其中所有者 = 'SCHEMA_NAME' 且 table_name = 'TABLE_NAME';


0
投票

选择所有者、表名称、列名称、数据默认值 FROM ALL_TAB_COLUMNS,其中 DATA_DEFAULT 不为空且所有者=''

© www.soinside.com 2019 - 2024. All rights reserved.