我们发现在客户端的一个UAT实例中没有一个序列"_SEQUENCE“。我们不知道它是怎么被删除的。这是一个非常关键的序列,因为这个序列生成的数字在DB的许多表中被用作唯一的列值。换句话说,DB中任何两个表中的两个列(特定的列类型)都不会有与值相同的数字。在很少的列上,我们也有唯一的索引。
我们可以再次创建序列,但是我们不知道序列的初始值应该是什么,因为我们不知道旧序列生成的最后一个数字是什么。如果我们将一个错误的数字设置为初始值,偶然地,如果它为已经存在的表的同一列生成相同的数字,那么我们可能会得到唯一的密钥冲突异常。
我们可以将初始值设置为一个非常大的数字,但这是最后一个选项。现在;
发布于 2018-11-27 21:43:41
闪回操作对于序列不可用,而对表可用。机制可能是由DDL触发器的贡献产生的,大多数是在SYS或SYSTEM数据库用户中创建的。例如,考虑这一程序:
create or replace procedure pr_ddl_oper as
v_oty varchar2(75) := ora_dict_obj_type;
v_don varchar2(75) := ora_dict_obj_name;
v_evt varchar2(75) := ora_sysevent;
v_olu varchar2(75) := nvl(ora_login_user,'Unknown Schema');
v_sql ora_name_list_t;
v_stm clob;
v_sct owa.vc_arr;
n pls_integer;
n_max pls_integer := 10000; -- max number of rows for CLOB object
-- to hold object's source.
begin
v_sct(1) := 'SESSIONID';
v_sct(2) := 'IP_ADDRESS';
v_sct(3) := 'TERMINAL';
v_sct(4) := 'OS_USER';
v_sct(5) := 'AUTHENTICATION_TYPE';
v_sct(6) := 'CLIENT_INFO';
v_sct(7) := 'MODULE';
for i in 1..7
loop
v_sct(i) := sys_context('USERENV',v_sct(i));
end loop;
select decode(v_sct(1),0,null,v_sct(1)),decode(upper(v_sct(3)),
'UNKNOWN',null,v_sct(3))
into v_sct(1),v_sct(3)
from dual;
n := ora_sql_txt( v_sql );
if n > n_max then
n := n_max;
end if;
for i in 1..n
loop
v_stm := v_stm || v_sql(i);
end loop;
insert into log_ddl_oper(event_time,usr,evnt,stmt,sessionid,ip,terminal,os_user,
auth_type,object_type,object_name,client_info,module_info)
values(sysdate,v_olu,v_evt,v_stm,v_sct(1),v_sct(2),v_sct(3),v_sct(4),v_sct(5),
v_oty,v_don,v_sct(6),v_sct(7));
end;该触发器可将其称为将来的引用:
--| Compiling this trigger, especially for Production Systems, should be handled with care |
create or replace trigger system.trg_admin_ddl before ddl on database
declare
begin
pr_ddl_oper;
end;通过连接SYS用户,您可以查询last_number列中删除的序列:
select last_number
from dba_sequences
as of timestamp to_timestamp('2018-11-27 23:50:17', 'YYYY-MM-DD HH24:MI:SS') s
where s.sequence_name = 'MYSEQ';可以检测到时间戳值的
select l.event_time
--> returns to_timestamp('2018-11-27 23:50:17', 'YYYY-MM-DD HH24:MI:SS')
--> to use for the above SQL Select statement
from log_ddl_oper l
where l.object_name = 'MYSEQ'
and l.evnt = 'DROP'https://stackoverflow.com/questions/53499868
复制相似问题