我使用此查询来获取属于Oracle数据库用户的序列列表:
SELECT * FROM all_sequences x,all_tables B
WHERE x.sequence_owner=B.owner AND B.TABLE_NAME='my_table';
Run Code Online (Sandbox Code Playgroud)
但是该数据库用户也有更多的序列,因此查询返回数据库用户的所有序列.任何人都可以帮我找到my_table
使用查询的特定顺序,以便我可以在我的应用程序中获取自动增量ID.
我希望查询获取我的数据库用户的表的列表与表中使用的序列和触发器
您可以从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;
Run Code Online (Sandbox Code Playgroud)
如果您实际上正在查看不同的架构,那么您将需要使用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>';
Run Code Online (Sandbox Code Playgroud)
如果它看不到它们,那么你可能需要查看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>';
Run Code Online (Sandbox Code Playgroud)
一种方法是运行这些查询来检查您的, , ,或中是否使用了任何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%';
Run Code Online (Sandbox Code Playgroud)
然后转到具体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));
Run Code Online (Sandbox Code Playgroud)
这将在内部创建一个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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
79677 次 |
最近记录: |