使用alter session set current_schema设置当前模式

在某个客户的Oracle 10.2.0.5 RAC生产库上,发现一个与平常不同现象,描述如下:
用户的数据表的所有者是DBO用户(之前从SQL Server迁移过来的),还有一个DEV用户,此用户没有任何对象。
查看v$session发现,前台应用都是用DEV用户登陆,再访问DBO用户的表。
我们都知道对于这种情况,一般是这样处理的:
1、将DBO用户表的对象权限授予给DEV用户
2、DEV用户登陆后,用“DBO.表名”的语法访问DBO的表
3、如果不想加“DBO.”,可以结合同义词功能
但这个数据库不一样,从监控的业务SQL语句看,DEV用户登陆后,访问DBO的表都没有加“DBO.”语法,而且没有创建任何私有或公有同义词,这是如何实现的?

后来发现,之前的管理员创建了一个数据库级别的触发器。部分代码为:
trigger LOGON_TRIGGER
after logon ON database
……
if  UPPER(sys.login_user) = UPPER('dev')
……
then
 EXECUTE IMMEDIATE 'ALTER   SESSION   SET   CURRENT_SCHEMA=DBO';
end if;
……

原来是用“alter session set current_schema = ……”语法设置了当前模式。

这个功能倒是不常见,测试一把:
测试环境是Oracle 10.2.0.5的单实例库,其中创建了一个us01用户,导入scott.dept表,又创建了一个us02用户,只授予登陆权限
1、以sys用户登陆,修改会话当前模式为us01,直接查询dept表成功
SQL> conn / as sysdba
Connected.
SQL> alter session set current_schema = us01;

Session altered.

SQL> select * from dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

2、以us02用户登陆,修改会话当前模式为us01,直接查询dept表报错,说明一般用户仍然需要授权才能访问。
SQL> conn us02/us02
Connected.
SQL> alter session set current_schema = us01;

Session altered.

SQL> select * from dept;
select * from dept
              *
ERROR at line 1:
ORA-00942: table or view does not exist


3、切换到us01用户,授予us02用户dept表的select权限,再切换到us02用户,就可以直接查询dept表了,不需要带"us01."
SQL> conn us01/us01
Connected.
SQL> grant select on dept to us02;

Grant succeeded.

SQL> conn us02/us02
Connected.
SQL> select * from dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

但并不能插入行,因为只授予了select权限
SQL> insert into dept values(1,'a','a');
insert into dept values(1,'a','a')
            *
ERROR at line 1:
ORA-01031: insufficient privileges

检查当前用户的对象权限,也可以确认只有刚才被授予的select权限
SQL> select grantee,owner,table_name,privilege from user_tab_privs;

GRANTEE  OWNER  TABLE_NAME PRIVILEGE
--------------- --------------- --------------- ------------
US02  US01  DEPT  SELECT

你可能感兴趣的:(Oracle工作记录)