2014-01-22 27 views
1

我正在處理Oracle數據庫時發生用戶錯誤。問題是一些人的記錄被轉移到另一個「回合」。每一輪都有「情節」:錯誤的「圓」意味着所有情節處理已經受到影響(情節跳過)。這些用戶不會收到因錯過「劇集」而應該收到的郵件。查找受用戶錯誤影響的表和反轉錯誤

我有一個查詢放在一起,標識所有記錄已被錯誤更新。我需要一種方法來修改查詢,以幫助找到所有表格錯誤地移動到「第2輪」。

(我需要找出所有的桌子是那些特色的「round_no」值)

編輯:有超過70+表!使用「ROUND_NO」COLUMN,我只需要識別在其中找到這些人員記錄的人員。

我還需要再取這些數據,然後返回到第1輪,從不正確的輪2

這裏是標識錯誤已經「跳過」進入第2輪的人查詢:

SELECT p.person_id 
,  p.name 
,  ep2.open_date 
,  (SELECT pr1.open_date 
     FROM Person_ep ep1 
     WHERE ep1.person_id = ep2.person_id 
     AND er1.round_no = 1 /* SOMETHING IS MISSING WHERE, WHERE IS er1 defined */ 
     ) 
     r1epiopen /* Round 1 episode open date */ 
FROM person p 
join region r 
on  r.region_code = p.region_code 
and r.location_id = 50 
join Person_ep er2 
ON  er2.person_id = p.person_id 
AND er2.round_no = 2 
ORDER 
BY  p.person_id 

在Oracle 11G RDBMS上使用SQL Developer 3.2.20.09。

+0

你想要一個帶'round_no'列的表列表;或者你想一次查詢所有的表?如果沒有動態SQL,你無法真正做到這一點,如果這是一次性的,那麼爲每個可能的表名手動複製/編輯代碼可能會更容易一些。 –

+0

嗨,一個名單與round_no會很好。 :)(這些特定的人存在) – GrumP

+0

我不明白這個問題。請嘗試更好地解釋。 –

回答

2

對不起,看到這個帖子那麼晚...希望這不是太晚...

我想你使用的是Oracle 10+,你知道大約犯罪的小時(!)。

我看到兩個可能性:

1)使用日誌礦工審查執行SQL:http://docs.oracle.com/cd/B19306_01/server.102/b14215/logminer.htm

2)使用閃回查詢過去審查表的數據。但是,對於這一個你需要測試在每一個可疑表(70+):(http://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htm#ADFNS01001

有嫌疑的表,你可以運行這樣的SQL,看看是否發生在時間範圍內更新: 選擇VERSIONS_STARTSCN,versions_starttime, VERSIONS_ENDSCN,versions_endtime, VERSIONS_XID,versions_operation, 描述
FROM MY_TABLE VERSIONS TIMESTAMP TO_TIMESTAMP BETWEEN( '2014年1月29日14時59分08秒', 'YYYY-MM-DD HH24:MI:SS') AND TO_TIMESTAMP ('2014-01-29 14:59:36','YYYY-MM-DD HH24:MI:SS') WHERE id = 1;

我沒有使用log miner的實際經驗,但我認爲這將是最好的解決方案,尤其是在激活存檔日誌的情況下:D

更新前可以訪問受影響表的數據值(如果您知道使用查詢像這樣的更新時間):

SELECT COUNT(*) FROM myTable AS OF TIMESTAMP TO_TIMESTAMP('2014-01-29 13:34:12', 'YYYY-MM-DD HH24:MI:SS'); 

當然,數據將只如果仍然可用(在撤消tablepace保留)。

然後你可以在更新之前創建的數據一個臨時表:

create table tempTableA as SELECT * FROM myTable AS OF TIMESTAMP TO_TIMESTAMP('2014-01-29 13:34:12', 'YYYY-MM-DD HH24:MI:SS'); 

然後用值與tempTableA來更新你的表。

+0

查找受影響的表是第一步,實際上回滾錯誤是我最需要的。 – GrumP

+0

使用閃回查詢可以在更新之前訪問記錄值,將它們保存在臨時表中,並使用舊值更新實際表。 –

1

如果你想找到列所有表「round_no」你,如果你想只將表也許應該使用此查詢

select table_name from all_tab_columns where column_name='round_no' 
1

可以更新

SELECT table_name 
    FROM user_tab_columns c, user_tables t 
    WHERE c.column_name = 'ROUND_NO' 
    AND t.table_name = c.table_name; 

應該工作

或純粹主義者

SELECT table_name 
    FROM user_tab_columns c 
    JOIN user_tables t ON t.table_name = c.table_name 
    WHERE c.column_name = 'ROUND_NO';