现有一个问题:
在处理一个业务时,发现一个表的某一条记录的某个字段值经常被修改成错误的值(每次修改都置为同一个值),
在对前台和后台程序检查后,查不到是哪个应用程序会做这样的修改,向各位高人请教下,如何捕获这条记录的
DML语句.
尝试过以下方法,好象不可以:
建立特定行的触发器,当该行被update时,查处执行该语句的sid
select v$lock.sid
from (select * from v$lock) v$lock, all_objects
where sid > 6
and v$lock.id1 = all_objects.object_id
and object_name like '%MANAGER_TM_TEST%' --要修改的表名
然后根据下面的语句
SELECT a.*
FROM v$sqltext a
WHERE a.hash_value =
(SELECT sql_hash_value FROM v$session b WHERE b.SID = V_SID)
查出执行的语句;
代码如下:create or replace trigger get_update_ssqll_manager_tm
after update of state on manager_tm_test
for each row
when (old.manager_id = 1318)
declare
v_sid number(10);
begin
select v$lock.sid
INTO V_SID
from (select * from v$lock) v$lock, all_objects
where sid > 6
and v$lock.id1 = all_objects.object_id
and object_name = 'MANAGER_TM_TEST';
INSERT INTO get_update_ssqll_manager_msg
SELECT a.*, seq_source_id.nextval
FROM v$sqltext a
WHERE a.hash_value =
(SELECT sql_hash_value FROM v$session b WHERE b.SID = V_SID);
end;
在处理一个业务时,发现一个表的某一条记录的某个字段值经常被修改成错误的值(每次修改都置为同一个值),
在对前台和后台程序检查后,查不到是哪个应用程序会做这样的修改,向各位高人请教下,如何捕获这条记录的
DML语句.
尝试过以下方法,好象不可以:
建立特定行的触发器,当该行被update时,查处执行该语句的sid
select v$lock.sid
from (select * from v$lock) v$lock, all_objects
where sid > 6
and v$lock.id1 = all_objects.object_id
and object_name like '%MANAGER_TM_TEST%' --要修改的表名
然后根据下面的语句
SELECT a.*
FROM v$sqltext a
WHERE a.hash_value =
(SELECT sql_hash_value FROM v$session b WHERE b.SID = V_SID)
查出执行的语句;
代码如下:create or replace trigger get_update_ssqll_manager_tm
after update of state on manager_tm_test
for each row
when (old.manager_id = 1318)
declare
v_sid number(10);
begin
select v$lock.sid
INTO V_SID
from (select * from v$lock) v$lock, all_objects
where sid > 6
and v$lock.id1 = all_objects.object_id
and object_name = 'MANAGER_TM_TEST';
INSERT INTO get_update_ssqll_manager_msg
SELECT a.*, seq_source_id.nextval
FROM v$sqltext a
WHERE a.hash_value =
(SELECT sql_hash_value FROM v$session b WHERE b.SID = V_SID);
end;
解决方案 »
- 请教 获取当前用户可以操作的某个数据库内所有表名称列表?
- oracle job不自动运行
- sql问题 关于别名的join
- Truncate语句问题,在线等,请大侠们进来看看。
- 十万火急呀,请各位oracle大虾们帮帮小妹吧!
- 在使用PL/SQL查询Oracle时,出现问题:内部错误代码,参数:[15160],[],[],[],[]:
- 如何检索存储过程或包中的匹配字段?
- job里执行一个存储过程,而存储过程有一个参数,是变量,这样的job怎么写,(见下面)(加急)
- 为什么这两条语句执行效率差这么多?
- 帮忙看看这个简单的pro*c程序,在线等待!!
- oracle数据库中文字段显示乱码?
- 拿分了,高分提问低级问题
FROM v$sqltext a
WHERE a.hash_value =
(SELECT sql_hash_value FROM v$session b WHERE b.SID = V_SID) 这样是不行的。
会得到你之前的那个句子。可以通过v$sql里面去找更新你的这个表的最后一个记录,可以知道里面的信息。连接的话,除了hash_value,还需要ADDRESS。这两个关键词。