查找受用户错误和影响的表格扭转错误

时间:2014-01-22 11:57:05

标签: sql oracle11g

我正在处理Oracle数据库,并且用户犯了错误。问题是一些人的记录被转移到一个不同的“回合”。每一轮都有“剧集”:错误的“圆形”意味着所有剧集处理都受到影响(剧集跳过)。由于错过了“剧集”,这些用户将不会收到他们应该收到的邮件。

我有一个查询放在一起,标识所有错误更新的记录。我需要一种方法来修改查询,以帮助找到错误地移入“第2轮”的所有表

(我需要识别的所有表格都是具有“round_no”值的表格)

编辑:有70多张桌子!使用“ROUND_NO”COLUMN,我只需要识别其中包含这些人员记录的那些。

我还需要获取此数据并将其从错误的第2轮返回第1轮。

这是一个查询,用于识别错误地被“跳过”到第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。

3 个答案:

答案 0 :(得分:2)

很抱歉看到这篇文章迟到了...希望现在还不晚......

我认为您使用的是Oracle 10+,而且您大约知道犯罪时间(!)。

我看到了两种可能性:

1)使用Log Miner查看执行的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以查看更新是否在时间范围内发生: SELECT versions_startscn,versions_starttime,        versions_endscn,versions_endtime,        versions_xid,versions_operation,        说明
来自my_table        TIMESTAMP TO_TIMESTAMP之间的版本('2014-01-29 14:59:08','YYYY-MM-DD HH24:MI:SS')        和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');

当然,数据只有在可用时才可用(保留在撤消表空间中)。

然后,您可以在更新之前创建包含数据的临时表:

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的值更新您的表。

答案 1 :(得分:1)

如果要查找列“round_no”的所有表,您可能应该使用此查询

select table_name from all_tab_columns where column_name='round_no'

答案 2 :(得分: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';