日期:2014-05-16  浏览次数:21756 次

创建应用环境问题
我想要通过创建应用环境,让用户zlr只能访问表A中用户名属于他自己的几条数据。
然后创建一个触发器实现用户登录时,获取用户名,如下:出现错误(加粗的错误信息)。
SQL> conn zlr/zhou14@practice;
SQL> create or replace package zlr_context as
  2 procedure select_xingming;
  3 end;
  4 /

程序包已创建。

SQL> create or replace package body zlr_context as
  2 procedure select_xingming is
  3 newxuhao number;
  4 begin
  5 select xuhao into newxuhao from A where upper(xingming)=
  6 sys_context('userenv','session_user');
  7 dbms_session.set_context('A_info','A_num',newxuhao);
  8 end select_xingming;
  9 end;
 10 /

程序包体已创建。

SQL> conn system/zhou14@practice;
已连接。
SQL> create or replace trigger zlr.security_context
  2 after logon on database
  3 begin
  4 zlr_context.select_xingming;
  5 end;
  6 /

触发器已创建

SQL> conn zlr/zhou14@practice
ERROR:
ORA-00604: 递归 SQL 级别 1 出现错误
ORA-01422: 实际返回的行数超出请求的行数
ORA-06512: 在 "ZLR.ZLR_CONTEXT", line 5
ORA-06512: 在 line 2



警告: 您不再连接到 ORACLE
SQL>

------解决方案--------------------
select xuhao from A where upper(xingming)= sys_context('userenv','session_user');

这个操作返回了超过一行记录,你可以加一个 and rownum = 1;