触发器想要实现根据不同登陆用户名启用不同操作,请问能否实现?

解决方案 »

  1.   

    可以的 
    取用户名:select SYS_CONTEXT('USERENV','SESSION_USER') from dual;select SYS_CONTEXT('USERENV','CURRENT_USER') from dual;select user from dual;取登录的机器名:
    select SYS_CONTEXT('USERENV','HOST') from dual;
    IP地址:select SYS_CONTEXT('USERENV','IP_ADDRESS') from dual;
      

  2.   

    也可以先取出 sessionID 再到 v$session里去查询(视图里有有关程序的信息)select SYS_CONTEXT('USERENV','SESSIONID') from dual;还可以获得操作系统登录用户:select SYS_CONTEXT('USERENV','OS_USER') from dual;
    不过 如果你要用SYS_CONTEXT 你的数据库必须是8i以上
      

  3.   

    这样可以查出用户名等信息,但是在触发器中加入这些判断怎么实现?
    如 
    if .... then ....if后面怎么写?????
      

  4.   

    你可以声明一个变量的啊!!username varchar2(30);BEGIN
        ....
        select user into username from dual;
        if username=.... then ....
        ....
    END;
      

  5.   

    这样取用户名可以,但是取客户端程序名就不可以
    select UPPER(PROGRAM)
          from v$session,
               (select SYS_CONTEXT('USERENV', 'SESSIONID') AS SESSIONID
                  from Dual) DUAL
         WHERE v$session.AUDSID = DUAL.SESSIONID
    这句在pl/sql中可以执行,但到了触发器中就不能执行,提示Compilation errors for TRIGGER RUN11.T11111111111Error: PL/SQL: ORA-00942: table or view does not exist
    Line: 153
    Text: from v$session,why??????????????/
      

  6.   

    刚才用sys登陆,授权了一下(试图v$session).结果就可以了.
    但是我用sql语句查询就能直接访问v$session,用触发器为什么不行呀?
      

  7.   


    刚才用sys登陆,授权了一下(试图v$session).结果就可以了.
    但是我用sql语句查询就能直接访问v$session,用触发器为什么不行呀?why?
      

  8.   

    这个是ORACLE的规定 没有why的 
    在PLSQL中,对于SYS用户的表、视图和其他资源的引用,必须显式授权。
      

  9.   

    在PL/SQL中 必须显式授权,没有why,这个是ORACLE的规定啊直接访问是因为这个用户可能有了SELECT ANY TABLE这个权限,可以访问任何表/视图。