2014-02-21 1 views
0

은 sysdate에서 업데이트 된 스키마 스키마의 모든 테이블을 가져 오기 위해 sql 쿼리를 작성해야합니다.sysdate에서 업데이트 된 스키마의 모든 테이블을 가져 오는 SQL 쿼리

select distinct(table_name) 
from All_Tab_Columns 
where owner = 'DBO' 
     and last_analyzed = sysdate; 

제대로 작동하지 않는 것 같습니다. (뿐만 아니라 힙에서 작동 - 아니 인덱스 즉, 테이블) -

+1

"작동하지 않는 것 같습니다"는 유효한 오류 메시지가 아닙니다. 어떤 문제가 있는지 구체적으로 설명하십시오. SQL은 일반적인 언어입니다 - RDBMS (구현)는 무엇입니까? 'last_analyzed'라는 이름의 컬럼이 당신이 원하는 정보를 가져야하는지 확신하지 못합니다 (참조 된 테이블이 변경되지 않았더라도 그 값이 업데이트 될 수 있습니다). –

+0

sysdate에서 업데이트 된 특정 스키마의 모든 테이블을 반환하는 sql 쿼리가 필요합니다. all_tab_columns에는 last_analyzed 필드가 있습니다. 나는 그것을 사용하려고 노력했다. 그것은 나를 위해 올바른 데이터를 반환하지 않습니다. – user2886453

+0

'last_analyzed'는 통계가 마지막으로 수집 된시기를 알려줍니다. 해당 날짜에 테이블의 데이터가 변경되었거나 DDL 변경 사항이 발생했는지 여부는 알려주지 않습니다. 그래서 ... '업데이트'란 무엇을 의미합니까? –

답변

1

내가 연결된 질문에 대한 답변에서 언급했듯이 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을 타임 스탬프로 변환 할 수 없습니다.

3

당신은 last_analyzedsysdateTRUNC 기능을 적용해야하고 그것은

select distinct(table_name) 
from All_Tab_Columns 
where owner = 'DBO' 
     and trunc(last_analyzed) = trunc(sysdate); 
+0

타임 스탬프를 처리 할 때 범위 (즉,'> = start_of_day' 및'

+0

제가 2014 년 2 월과 같은 한 날짜에 그것을 사용하려고 할 때 값을 가지고 있습니다. 레코드를 반환하지 않습니다. – user2886453

+0

아마도 last_analyzed> = trunc (sysdate). trunc 함수가 없으면 더 빨리 실행됩니다. –

-1

당신은 DMV를 사용하여 작동합니다 당신이에 가입 확장 할 수 있습니다 스키마

SELECT 
    OBJECT_NAME(OBJECT_ID) AS TableName, last_user_update AS UpdateDateTime 
FROM 
    sys.dm_db_index_usage_stats 
WHERE 
    database_id = DB_ID('PUT_DB_NAME') 
    AND last_user_update = 'EnterDateTimeHereToFilterOn' 
0

쉬운 방법은 없습니다. 테이블별로 테이블을 조작해야합니다. 그런 다음 각 테이블에이 쿼리를 실행합니다

select max(SCN_TO_TIMESTAMP(ORA_ROWSCN)) from <table_name>; 

ORA_ROWSCN

는이 블록 레벨에 저장되어, 오라클 가상 의사 열입니다. 여기에는 데이터베이스 블록을 수정 한 마지막 트랜잭션의 "시퀀스 번호"가 들어 있습니다.

함수 SCN_TO_TIMESTAMP는이를 사람이 읽을 수있는 날짜 데이터 유형으로 변환합니다.

관련 문제