내가 연결된 질문에 대한 답변에서 언급했듯이 ORA_ROWSCN
의사 열을 사용하여 테이블이 마지막으로 업데이트 된시기를 알 수 있습니다. 그러면 스키마의 모든 테이블이 예제로 표시되고 지정된 날짜에 수정 된 테이블이 ORA_ROWSCN
에 따라 나열됩니다. 물론 이것은 실행하는 데 시간이 걸릴 수 있습니다.
set serveroutput on
declare
last_update varchar2(10);
bad_scn exception;
no_scn exception;
pragma exception_init(bad_scn, -8181);
pragma exception_init(no_scn, -1405);
begin
for r in (select table_name from all_tables where owner = 'DBO') loop
begin
execute immediate 'select to_char(scn_to_timestamp(max(ora_rowscn)), '
|| '''YYYY-MM-DD'') from DBO.' || r.table_name
into last_update;
if last_update = '2014-02-21' then
dbms_output.put_line(r.table_name || ' last updated on ' || last_update);
end if;
exception
when bad_scn then
dbms_output.put_line(r.table_name || ' - bad scn');
when no_scn then
dbms_output.put_line(r.table_name || ' - no scn');
end;
end loop;
end;
/
예외 핸들러 (나열하지만 SCN이없는) 플레이를 덮고, 그리고 몇 가지 이유로 잘못 SCN이이고; 당신은 그것들을 보여주기보다는 무시하기를 원할 것입니다. 당신이 오늘을 찾는 경우
이 아닌 특정 날짜, 다음이 더 빠를 수 있습니다
declare
start_scn number;
changed_rows number;
changed_tables number := 0;
begin
start_scn := timestamp_to_scn(trunc(systimestamp));
for r in (select table_name from all_tables where owner = 'BDO'
order by table_name) loop
execute immediate 'select count(*) from ('
|| 'select ora_rowscn from BDO.' || r.table_name
|| ') where ora_rowscn >= :1 and rownum < 2'
into changed_rows
using start_scn;
if changed_rows > 0 then
dbms_output.put_line(r.table_name || ' updated');
changed_tables := changed_tables + 1;
end if;
end loop;
dbms_output.put_line(changed_tables || ' tables updated today');
end;
/
당신은 정말 어떤 날짜 같은 일을 할 수 있지만, 당신이 찾아야 할 것 초기 및 그 날의 최신 SCN (현재 날짜보다 복잡합니다). 또한이 기능은 플래시백 창에서만 작동합니다. 먼 곳으로 돌아 가면 어쨌든 SCN을 타임 스탬프로 변환 할 수 없습니다.
"작동하지 않는 것 같습니다"는 유효한 오류 메시지가 아닙니다. 어떤 문제가 있는지 구체적으로 설명하십시오. SQL은 일반적인 언어입니다 - RDBMS (구현)는 무엇입니까? 'last_analyzed'라는 이름의 컬럼이 당신이 원하는 정보를 가져야하는지 확신하지 못합니다 (참조 된 테이블이 변경되지 않았더라도 그 값이 업데이트 될 수 있습니다). –
sysdate에서 업데이트 된 특정 스키마의 모든 테이블을 반환하는 sql 쿼리가 필요합니다. all_tab_columns에는 last_analyzed 필드가 있습니다. 나는 그것을 사용하려고 노력했다. 그것은 나를 위해 올바른 데이터를 반환하지 않습니다. – user2886453
'last_analyzed'는 통계가 마지막으로 수집 된시기를 알려줍니다. 해당 날짜에 테이블의 데이터가 변경되었거나 DDL 변경 사항이 발생했는지 여부는 알려주지 않습니다. 그래서 ... '업데이트'란 무엇을 의미합니까? –