创建应用环境问题
我想要通过创建应用环境,让用户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;