设oracle中有两个sequence分别为myseq1和myseq2.
某个表test(id number primary key,name varchar2(20));
test中的id字段是用myseq1生成的.
试问:我如何查到test表id字段使用的是myseq1而不是myseq2?
oracle中如何获得某个表的正在或曾经使用的sequence?
答案:2 悬赏:0
解决时间 2021-03-08 08:40
- 提问者网友:放荡不羁
- 2021-03-08 02:15
最佳答案
- 二级知识专家网友:邪性洒脱
- 2021-03-08 03:53
好象它们两者没有依属联系,而确实在工作中又容易遇见此类问题.
从序列的角度来思考的话,仅跟用户相关。
以下步骤可以参考:
1 从系统视图中取得所有序列的相关信息。
注意相关权限。
select sequence_name,min_value,max_value,increment_by,last_number from all_sequences
如果能够能够排除 用户A的表数据,采用了用户B的sequence来生成数据的情况,那可以加上
where sequence_owner=' '; -----适合的用户
或者从USER_SEQUENCES中提取。
2 从关心的表中提取敏感字段的最大值
select max(id) from test;
3 将两者对比。或者将上述两个查询连接到一起来查询。如果当前该表没有被插入,并且,近期没有被删除,那么,该max(id)+1=last_number ;
如果非要弄清楚的话,那就将表数据保护起来,拒绝删除数据,当发现数据插入后,观察插入的频度和事务提交后序列列值变化的大小,由此最终能判断出是哪个序列号。基于非要准确的搞清楚的前提下,使用排出法,将上述最接近的序列按照从轻度怀疑到高度怀疑的顺序,再备份的情况下,依次删除、恢复.....这样肯定能搞准。
还有一个最好的办法以后遇到这种情况就简单了。在该表上建立基于插入后的触发器,在触发器中包含上面查询思想,将max(id)+1=last_number 的序列名返回。。。。则绝对不会错
.
知识有限,在此也期盼能学习到更高级的方法。
希望能帮到你。.
从序列的角度来思考的话,仅跟用户相关。
以下步骤可以参考:
1 从系统视图中取得所有序列的相关信息。
注意相关权限。
select sequence_name,min_value,max_value,increment_by,last_number from all_sequences
如果能够能够排除 用户A的表数据,采用了用户B的sequence来生成数据的情况,那可以加上
where sequence_owner=' '; -----适合的用户
或者从USER_SEQUENCES中提取。
2 从关心的表中提取敏感字段的最大值
select max(id) from test;
3 将两者对比。或者将上述两个查询连接到一起来查询。如果当前该表没有被插入,并且,近期没有被删除,那么,该max(id)+1=last_number ;
如果非要弄清楚的话,那就将表数据保护起来,拒绝删除数据,当发现数据插入后,观察插入的频度和事务提交后序列列值变化的大小,由此最终能判断出是哪个序列号。基于非要准确的搞清楚的前提下,使用排出法,将上述最接近的序列按照从轻度怀疑到高度怀疑的顺序,再备份的情况下,依次删除、恢复.....这样肯定能搞准。
还有一个最好的办法以后遇到这种情况就简单了。在该表上建立基于插入后的触发器,在触发器中包含上面查询思想,将max(id)+1=last_number 的序列名返回。。。。则绝对不会错
.
知识有限,在此也期盼能学习到更高级的方法。
希望能帮到你。.
全部回答
- 1楼网友:承载所有颓废
- 2021-03-08 05:02
你这个其实挺复杂的,要建立一系列的东西来满足你这个需求
给你做个实验吧
先建立一个表
create table test
(id varchar2(20) not null primary key ,
name varchar2(100));
创建一个序列
create sequence seqtest
increment by 1
start with 1
maxvalue 999
nocycle
cache 10;
创建一个存储过程,这个很重要,每天半夜12点执行一次,这个主要是把序列重新置0用的,然后还需要定义一个job来调用这个存储过程
create or replace procedure p_seq
as
n number(10);
v_sql varchar2(100);
begin
select seqtest.nextval into n from dual;
n:=-(n-1);
v_sql:='alter sequence seqtest increment by'|| n;
execute immediate v_sql;
select seqtest.nextval into n from dual;
v_sql:='alter sequence seqtest increment by 1';
execute immediate v_sql;
end;
然后创建一个触发器
create or replace trigger t_test
before insert on test
for each row
begin
select to_char(sysdate,'yyyymmdd')||'_'||lpad(seqtest.nextval,3,0) into :new.id from dual;
end ;
存储过程我没测试,但是编译能过去
现在做个试验
执行这样一个语句
insert into test(name) values ('aa');
然后你检查下数据,然后继续插入再看看
select * from test;
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯