你可以用 select username from v$session; 查到哪些终端正和数据库连接,所以你可以对每个具体的表做触发器实现,但是怎么KILL还得多想想了
却确地说不是在系统表上加触发器,而是建立系统级触发器。 CREATE OR REPLACE TRIGGER DOER.DTR06 logon ON 数据库名.schema名 begin ...... end. 不过能不能在里面执行alter system kill session
请教为什么会报这个错! 可是单独运行 select 'ALTER SYSTEM KILL SESSION ''' ||sid || ','|| serial# ||''';' s from v$session where program='plsqldev.exe'; 就不会抱错!
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'; 就不会抱错!
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 怎么不起作用? 编译通过了!
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 怎么不起作用?
v_$session视图不是实际存在的一个表,只能查看,不能修改和删除或者手动插入数据的
下面的触发器已经在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;
select 'ALTER SYSTEM KILL SESSION ''' ¦ ¦sid ¦ ¦ ',' ¦ ¦ serial# ¦ ¦''';' into ls_sql from v_$session where program='plsqldev.exe'; 这句有问题
select 'ALTER SYSTEM KILL SESSION ''' ¦¦sid ¦¦ ',' ¦¦ serial# ¦¦'''' into ls_sql from v_$session where program='plsqldev.exe'; 把分号去了就可以运行。 经过试验,有点延时,但是可以Kill掉目标的session。 LZ没有成功的原因是不是plsqldev.exe这个应用程序的名字没有写对啊!
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看模块名。
select 'ALTER SYSTEM KILL SESSION ''' ¦ ¦sid ¦ ¦ ',' ¦ ¦ serial# ¦ ¦''';' into ls_sql from v_$session where program='plsqldev.exe'; 这句应该有错误把,系统都有好多session你的into会报错的 你可以差日志,应该有错
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'
或者当非法的IP登录后立即kill也行请给于指点!谢谢
最好能给出脚本!
你可以在工具'Net Manager'的“概要文件”中,选“一般信息”下拉条,再选“访问权限”选项卡,就可以看到了。
你也可以在sqlnet.ora中设置tcp.validnode_checking=yes invited_nodes=(ip1,ip2....)--只在列表内才访问
http://junmail.javaeye.com/blog/162231
以上是通过修改配置文件来实现的,不知道能不能在系统表上增加触发器来实现,发现有违法的IP就kill这个进程,
如何实现,请各位高手指点.
最好给出脚本
select username from v$session;
查到哪些终端正和数据库连接,所以你可以对每个具体的表做触发器实现,但是怎么KILL还得多想想了
CREATE OR REPLACE TRIGGER DOER.DTR06
logon
ON 数据库名.schema名
begin
......
end.
不过能不能在里面执行alter system kill session
可是单独运行
select 'ALTER SYSTEM KILL SESSION ''' ||sid || ','|| serial# ||''';' s from v$session where program='plsqldev.exe';
就不会抱错!
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';
就不会抱错!
你需要直接指派权限,而不是通过赋予用户“角色”是用户具有访问v$session的权限。
这是存储过程的限制。
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 怎么不起作用?
编译通过了!
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 怎么不起作用?
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;
这句有问题
把分号去了就可以运行。
经过试验,有点延时,但是可以Kill掉目标的session。
LZ没有成功的原因是不是plsqldev.exe这个应用程序的名字没有写对啊!
请问楼上各位
有没有什么好办法拒绝用pl/SQL Developer登录到Oracle服务器,
我不想用用户授权的方式控制.
如果是的话,楼主是怎么测试这个办法不行的呢?
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看模块名。
不过不应该是after logon吧?
赫赫
这句应该有错误把,系统都有好多session你的into会报错的
你可以差日志,应该有错
om v_$session where program='plsqldev.exe';'ALTERSYSTEMKILLSESSION'''||SID||','||SERIAL#||''''
--------------------------------------------------------------------------------ALTER SYSTEM KILL SESSION '10,7058'
ALTER SYSTEM KILL SESSION '12,2205'