如何根据客户端的IP地址或计算机名称
如何只能让指定的IP地址或计算机名称登录Oracle服务器
或者当非法的IP登录后立即kill也行请给于指点!谢谢

解决方案 »

  1.   

    如何只能让指定的IP地址或计算机名称登录Oracle服务器
    或者当非法的IP登录后立即kill也行请给于指点!谢谢
    最好能给出脚本!
      

  2.   

    oracle 自身不行,不过可以考虑从操作系统上实现
    == 思想重于技巧 ==
      

  3.   

    oracle可以的,通过监听器的验证功能来实现。
    你可以在工具'Net Manager'的“概要文件”中,选“一般信息”下拉条,再选“访问权限”选项卡,就可以看到了。
    你也可以在sqlnet.ora中设置tcp.validnode_checking=yes   invited_nodes=(ip1,ip2....)--只在列表内才访问
      

  4.   

    楼上正解!可以通过profile来实现!
      

  5.   

    look:
    http://junmail.javaeye.com/blog/162231
      

  6.   

    首先要谢谢各位的指导,
    以上是通过修改配置文件来实现的,不知道能不能在系统表上增加触发器来实现,发现有违法的IP就kill这个进程,
    如何实现,请各位高手指点.
    最好给出脚本
      

  7.   

    你可以用 
    select username from v$session;
    查到哪些终端正和数据库连接,所以你可以对每个具体的表做触发器实现,但是怎么KILL还得多想想了 
      

  8.   

    却确地说不是在系统表上加触发器,而是建立系统级触发器。
    CREATE OR REPLACE TRIGGER DOER.DTR06
    logon
    ON 数据库名.schema名
    begin
    ......
    end.
    不过能不能在里面执行alter system kill session
      

  9.   

    请教为什么会报这个错!
    可是单独运行
    select 'ALTER SYSTEM KILL SESSION  ''' ||sid || ','|| serial# ||''';' s from v$session where program='plsqldev.exe';
    就不会抱错!
      

  10.   

    CREATE OR REPLACE TRIGGER abc_h
    AFTER LOGON ON DATABASE
    DECLARE
    cursor c1 is select 'ALTER SYSTEM KILL SESSION  ''' ||sid || ','|| serial# ||''';' s from v$session where program='plsqldev.exe';
    BEGIN
    for myc in c1 loop
        execute immediate myc.s;
    end loop;
    END;
    Compilation errors for TRIGGER SYSTEM.ABC_HError: PL/SQL: ORA-00942: 表或视图不存在
    Line: 6
    请教为什么会报这个错!
    可是单独运行
    select 'ALTER SYSTEM KILL SESSION  ''' ||sid || ','|| serial# ||''';' s from v$session where program='plsqldev.exe';
    就不会抱错!
      

  11.   

    因为你的用户权限不足以访问v$session。
    你需要直接指派权限,而不是通过赋予用户“角色”是用户具有访问v$session的权限。
    这是存储过程的限制。
      

  12.   

    CREATE OR REPLACE TRIGGER abc_h after LOGON ON DATABASE
    declare
        ls_sql varchar2(200);
    BEGIN
        select 'ALTER SYSTEM KILL SESSION  ''' ||sid || ','|| serial# ||''';' into ls_sql from v_$session where program='plsqldev.exe';
        execute immediate ls_sql;
    END;
    我的TRIGGER 怎么不起作用?
    编译通过了!
      

  13.   

    CREATE OR REPLACE TRIGGER abc_h after LOGON ON DATABASE
    declare
        ls_sql varchar2(200);
    BEGIN
        select 'ALTER SYSTEM KILL SESSION  ''' ||sid || ','|| serial# ||''';' into ls_sql from v_$session where program='plsqldev.exe';
        execute immediate ls_sql;
    END;编译通过了,可是TRIGGER 怎么不起作用? 
      

  14.   

    v_$session视图不是实际存在的一个表,只能查看,不能修改和删除或者手动插入数据的
      

  15.   

    下面的触发器已经在sys用户下编译成功了,可就是不能起作用,不知道是什么回事?请各位高手指点,谢谢。
    CREATE OR REPLACE TRIGGER abc_h after LOGON ON DATABASE 
    declare 
        ls_sql varchar2(200); 
    BEGIN 
        select 'ALTER SYSTEM KILL SESSION  '''  ¦ ¦sid  ¦ ¦ ',' ¦ ¦ serial#  ¦ ¦''';' into ls_sql from v_$session where program='plsqldev.exe'; 
        execute immediate ls_sql; 
    END; 
      

  16.   

    select 'ALTER SYSTEM KILL SESSION  '''  ¦ ¦sid  ¦ ¦ ',' ¦ ¦ serial#  ¦ ¦''';' into ls_sql from v_$session where program='plsqldev.exe';
    这句有问题
      

  17.   

    select 'ALTER SYSTEM KILL SESSION  '''  ¦¦sid  ¦¦ ',' ¦¦ serial#  ¦¦'''' into ls_sql from v_$session where program='plsqldev.exe';
    把分号去了就可以运行。
    经过试验,有点延时,但是可以Kill掉目标的session。
    LZ没有成功的原因是不是plsqldev.exe这个应用程序的名字没有写对啊!
      

  18.   

    上面的触发器还是不能成功运行,plsqldev.exe这个名称肯定没有问题.
    请问楼上各位
    有没有什么好办法拒绝用pl/SQL Developer登录到Oracle服务器,
    我不想用用户授权的方式控制.
      

  19.   

    当pl/SQL Developer连接数据库时,查询v$session的Program字段的值是“plsqldev.exe”吗?
    如果是的话,楼主是怎么测试这个办法不行的呢?
      

  20.   

    因为我加载了上面系统级触发器后,照样可以用pl/SQL Developer登录到Oracle中!
      

  21.   

    create or replace trigger tr_ip_check
    after logon on database
    declare
    v_ip varchar2(30);
    v_client varchar2(50);
    begin
    select sys_context('USERENV','IP_ADDRESS') into v_ip from dual;
    select sys_context('USERENV','MODULE') into v_client from dual;
    if v_ip<>'xxx.xxx.xxx.xxx' and v_client='TOAD 9.1.0.62' then
    raise_application_error('-20001','拒绝登陆!');
    end if;
    end;
    /
    ========================================
    IP写允许登陆的ip,
    我没有pl/SQL Developer,登陆模块写的是TOAD,可以用select sys_context('USERENV','MODULE') into v_client from dual看模块名。
      

  22.   

    注意如果客户端的登陆帐号有DBA权限,那么这个触发器将无效。
      

  23.   

    楼上的说得很好
    不过不应该是after logon吧?
    赫赫
      

  24.   

    我测试了一下,使用这个触发器后,被禁止的用户根本就无法使用数据库了。所以一定是after logon了。
      

  25.   

     select 'ALTER SYSTEM KILL SESSION  '''  ¦ ¦sid  ¦ ¦ ',' ¦ ¦ serial#  ¦ ¦''';' into ls_sql from v_$session where program='plsqldev.exe';  
     这句应该有错误把,系统都有好多session你的into会报错的
    你可以差日志,应该有错
      

  26.   

    SQL> select 'ALTER SYSTEM KILL SESSION  '''  ||sid  || ',' || serial#  ||'''' fr
    om v_$session where program='plsqldev.exe';'ALTERSYSTEMKILLSESSION'''||SID||','||SERIAL#||''''
    --------------------------------------------------------------------------------ALTER SYSTEM KILL SESSION  '10,7058'
    ALTER SYSTEM KILL SESSION  '12,2205'