我们的数据库中有一个表最近莫名其妙的丢失部分数据。
所以我想建个触发器,删除时将数据插入到另一个表中记录下,同时想把操作人的机器名,使用的程序名记录上。
但我无法得到操作人的机器名和使用的程序名,我看V$session中有machine(或者terminal),program列,但只能查询出所有的会话的信息,无法找到当前会话的特征,所以无法定位到当前用户。 大家帮忙看看,有办法得到当前操作人的机器名和程序名么?
所以我想建个触发器,删除时将数据插入到另一个表中记录下,同时想把操作人的机器名,使用的程序名记录上。
但我无法得到操作人的机器名和使用的程序名,我看V$session中有machine(或者terminal),program列,但只能查询出所有的会话的信息,无法找到当前会话的特征,所以无法定位到当前用户。 大家帮忙看看,有办法得到当前操作人的机器名和程序名么?
解决方案 »
- Oracle10G Express
- 求助oracel函数或存储过程:其输入参数如果为空则默认查询所有记录,如何设置?
- 关于Oracle的分析函数Last_First()的问题?
- 根据相邻行记录筛选记录
- 求sql语句如何优化,急!5
- linux启动了两个oracle服务,如何停止其中之一?
- 如何Windows 2003R2下的Oracle10.2.0.1复制一份到RadHat Linux4.5下?
- 急!!!
- 问一个关于备份,恢复的问题
- 我有一个数据库文件,它的扩展名是:*.db的。现在我要把它里面的数据导出来,请问怎样做。
- 请问ORACLE登录问题 报错:ora-01017
- 一个简单的sql问题,给出正确答案的都给分啊!
select * from v$session where audsid=userenv('sessionid');
这语句确实可以查出来,但我加在触发器里,提示:PLS-00201: 必须说明标识符 'SYS.V_$SESSION'楼上的帮人帮到底,看看是什么问题,怎么解决下。
你必须有sys用户权限,并且用sys用户授权,那个触发器才能编译通过taoether 2008年12月29日 15点58分58秒 说:
只要这个用户有这个权限就可以,是这样么hyee 2008年12月29日 15点55分55秒 说:
是的,你的触发器没有问题,缺少的是权限taoether 2008年12月29日 16点02分51秒 说:
但为什么用户登录后,可以查询V$session这个表呢,搞不明白奇怪啊,怎么办呢
http://topic.csdn.net/u/20081021/12/89e62efa-cd83-4170-b8e7-109593631a51.html
比如有视图V_$SQL_BIND_CAPTURE,它授予SELECT权限给SELECT_CATALOG_ROLE这个角色,然后SELECT_CATALOG_ROLE这个角色有通过间接方式授权给拥有DBA角色的用户(假设为CX)。CX在编译它自己存储过程时,如果碰到一条调用V_$SQL_BIND_CAPTURE视图的静态SQL,这时它编译不过去,因为在编译时,它不会检查DBA这个ROLE是否拥有读V_$SQL_BIND_CAPTURE的权限,而仅仅检查CX和PUBLIC这两个用户。所以,你的触发器有两种解决方式:
第一种就像我刚才所说,将v_$session的读权限授权给它自己或者public用户
另一种,写动态sql,并且动态sql的环境是current_user举个例子:--authid current_user
create or replace function xxx return INT AUTHID CURRENT_USER IS
x INT;
BEGIN
EXECUTE IMMEDIATE 'SELECT 1 FROM v$sql_bind_capture WHERE ROWNUM=1' INTO x;
RETURN x;
END;
/
SQL> select xxx from dual;
XXX
----------
1
--authid definer
create or replace function xxx return INT IS
x INT;
BEGIN
EXECUTE IMMEDIATE 'SELECT 1 FROM v$sql_bind_capture WHERE ROWNUM=1' INTO x;
RETURN x;
END;
/
SQL> select xxx from dual;
select xxx from dual
ORA-00942: 表或视图不存在
ORA-06512: 在 "DBO.XXX", line 4
/*这贴的5楼4不4正解*/