如何得到当前操作人的机器名和程序名么

小山9527 2008-12-29 03:00:26
我们的数据库中有一个表最近莫名其妙的丢失部分数据。
所以我想建个触发器,删除时将数据插入到另一个表中记录下,同时想把操作人的机器名,使用的程序名记录上。

但我无法得到操作人的机器名和使用的程序名,我看V$session中有machine(或者terminal),program列,但只能查询出所有的会话的信息,无法找到当前会话的特征,所以无法定位到当前用户。

大家帮忙看看,有办法得到当前操作人的机器名和程序名么?
...全文
117 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ORHCLE 2010-03-24
  • 打赏
  • 举报
回复
hyee 2008-12-29
  • 打赏
  • 举报
回复
触发器和存储过程在编译的时候,是以definer的身份编译的。definer在编译或执行一条SQL时,如果一个表或视图不属于它本身,并且没有授权给它自己或者public对象,那么不通过,它不检索通过它所属的role所拥有的权限(见表dba_tab_privs)。而在sql*plus执行select时,是以invoker(调用者)身份查询的,它除了检索一个表是否授权给自己或PUBLIC用户外,还检索当前会话的用户所属的role是否具备操作该表的权限。


比如有视图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
范佩西_11 2008-12-29
  • 打赏
  • 举报
回复
给你一篇以前的帖子。比你这复杂的多
http://topic.csdn.net/u/20081021/12/89e62efa-cd83-4170-b8e7-109593631a51.html
小山9527 2008-12-29
  • 打赏
  • 举报
回复


hyee 2008年12月29日 15点51分44秒 说:
你必须有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这个表呢,搞不明白

奇怪啊,怎么办呢
小山9527 2008-12-29
  • 打赏
  • 举报
回复
谢谢楼上
这语句确实可以查出来,但我加在触发器里,提示:PLS-00201: 必须说明标识符 'SYS.V_$SESSION'

楼上的帮人帮到底,看看是什么问题,怎么解决下。
hyee 2008-12-29
  • 打赏
  • 举报
回复
查当前会话:
select * from v$session where audsid=userenv('sessionid');

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧