角色role1在oracle数据库中是建好的,用户user1通过程序登陆到数据库中时候,由程序把role1分配给user1
当用户user1退出程序,角色取消或者user1再用程序登陆后,用sqlplus登陆到数据库中时这个session没有授权。

解决方案 »

  1.   

    可以考虑触发器, after logon on database, before logoff on database可问题是:你用user1登录的,你不具有role1权限,能把role1 分配给user1吗?除非你的程序是dba帐号连到数据库的,此时给user1分配role1, 然后再用user1登录
      

  2.   

    用登陆触发器能行吗?能区分通过什么登陆的?授权也是对于session的?只是在让他用特定的程序,登陆进来后才能操作数据,这样规矩
    如果用sqlplus登陆进来,可以把整个表都删掉,很危险?
      

  3.   

    在程序中有个权限高的用户给user1授权,但是这个role1只在这个session中生效如果这是他在用sqlplus登陆到数据库,这个session没有role1这个角色,不能做什么操作
      

  4.   

    可以。通过v$session的program判断所使用程序。
      

  5.   

    --这个触发器限定了scott只能用sqlplus 登录,用其它工具不用登录
    --已经测试create or replace trigger tr_after_logon
    after logon on database
    declare
    v_program varchar2(50);
    begin
      
    IF SYS_CONTEXT('USERENV', 'SESSION_USER') = 'SCOTT' THEN
    --获取program
    SELECT program
      INTO v_program
      FROM v$session
     WHERE AUDSID = USERENV('SESSIONID')
       AND rownum = 1;

    --if user is not use sqlplus, raise an application error.   
    --note: user can continue logon if he has DBA role privilege 
    IF UPPER(v_program) NOT LIKE '%SQLPLUS%' THEN
    RAISE_APPLICATION_ERROR(-20001, 'you can''t logon except you use sqlplus');
    END IF;
    END IF;
    end;
      

  6.   

    用sys创建这个trigger.  要在sp中访问v$session, 需要有相关的权限
      

  7.   

    你的触发器好像也不可行的,要是自己写一个程序也给它起名叫“sqlplus.exe”不是一样可以登录了吗?(下面是测试结果)
    觉得楼主的问题根本是管理的问题,不要让别人知道密码,还有管理好用户的权限,实在不放心开审计。把sqlplus的名称改为sqlplus123后登录:
    SQL> /PROGRAM
    ----------------------------------------------------------------
    sqlplus123.exe
    sqlplus.exe
      

  8.   


    这个触发器通过程序名字限制了登陆,我觉得还没有从根本上解决问题
    正如楼上说得那样,通过模拟程序名一样可以登陆进来如果通过特定的业务程序登陆进来,则授角色给他,角色作用范围仅仅限于这个session,可以完成正常工作。
    如果这是他通过sqlplus登陆进来,在这个session里仍然没有授权,无法做一些操作;