ORACLE 在重要的表上限制某些IP、用户的恶意操作

1,问题描述

         oracle默认账号是没有限制ip的,这样的隐患就在于,如果我知道了oracle账号用户名密码,我只要能连接到db,就可以对db进行操作,这样对于线上的db来说是很危险的,因为有些非dba人员,比如开发人员、测试人员一不小心误删除了线上的数据,就惨了,坑太大不敢看。所以查了查,找到一种办法,在一些重要的表上加触发器来限制用户对线上db的表的操作。

2,触发器编写

如果开全局的sql审计,消耗性能太大,不太合适,想来只有在某些重要的表上做限制,初步解决问题了。

1)  验证ip:(sys_context(‘userenv‘,‘ip_address‘)not in(‘192.168.120.211‘)

2)  验证用户名:selects.USERNAME into v_username from v$session s where s.audsid=(selectuserenv(‘SESSIONID‘) from dual) and rownum<2

3)  样例存储过程如下:

create or replace triggerpri_stu_test_limit

before update or delete or insert on stu.zzz_test

DECLARE

PRAGMA AUTONOMOUS_TRANSACTION;

v_username varchar2(200) default ‘‘;

BEGIN

select s.USERNAME into v_username from v$session s wheres.audsid=(select userenv(‘SESSIONID‘) from dual) and rownum<2;

IFdeleting

AND (sys_context(‘userenv‘,‘ip_address‘) not in(‘192.168.120.211‘)     OR ‘stuuser‘ like v_username)

THEN

RAISE_APPLICATION_ERROR(-20001, ‘can not delete the table ‘);

ELSIF inserting

AND (sys_context(‘userenv‘,‘ip_address‘) not in(‘192.168.120.211‘)     OR ‘stuuser‘ like v_username)

THEN

RAISE_APPLICATION_ERROR(-20001, ‘can not insert the table ‘);

ELSIF updating

AND (sys_context(‘userenv‘,‘ip_address‘) not in(‘192.168.120.211‘)     OR ‘stuuser‘ like v_username)

THEN

RAISE_APPLICATION_ERROR(-20001, ‘can not update the table ‘);

END IF;

END;

原blog地址:http://blog.csdn.net/mchdba/article/details/48790259,未经过原博主黄杉(mchdba)同意,不允许转载,谢谢。

3,验证:

SQL>

SQL> insert into stu.zzz_testvalues(3,‘zhuren33‘);

insert into stu.zzz_testvalues(3,‘zhuren33‘)

ORA-20001: can not insert the table

ORA-06512: at"stuuser.PRI_STU_ACCT_LIMIT", line 18

ORA-04088: error during execution oftrigger ‘stuuser.PRI_STU_ACCT_LIMIT‘

SQL> commit;

Commit complete

SQL>

SQL> update stu.zzz_test setremark=‘zhuren33_up‘ where id=3;

update stu.zzz_test setremark=‘zhuren33_up‘ where id=3

ORA-20001: can not update the table

ORA-06512: at"stuuser.PRI_STU_ACCT_LIMIT", line 22

ORA-04088: error during execution oftrigger ‘stuuser.PRI_STU_ACCT_LIMIT‘

SQL> commit;

Commit complete

SQL>

SQL> delete from  stu.zzz_test where id=3;

delete from stu.zzz_test where id=3

ORA-20001: can not delete the table

ORA-06512: at"stuuser.PRI_STU_ACCT_LIMIT", line 14

ORA-04088: error during execution oftrigger ‘stuuser.PRI_STU_ACCT_LIMIT‘

SQL> commit;

Commit complete

SQL>

OK增删改都可以被限制住了,应该暂时解决了问题所在,后续还是有很多问题需要一起解决的。

参考文章oracle限制ip:http://blog.chinaunix.net/uid-9518120-id-197704.html

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-17 00:05:53

ORACLE 在重要的表上限制某些IP、用户的恶意操作的相关文章

Oracle sql语句创建表空间、数据库、用户及授权

--创建表空间和数据库文件及默认表空间大小 create tablespace TableSpace_Test datafile 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DataBase_Test.DBF' size 200m; --设置数据库自动增长 alter database datafile 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DataBase_Test.DBF' autoextend on; --创建用户

恢复oracle中误删除的表

查看回收站中表 select object_name,original_name,partition_name,type,ts_name,createtime,droptime from recyclebin; 恢复表 SQL>flashback table ZCM002;或SQL>flashback table "BIN$A8uJNocaGVzgUwwrCgpDBg==$0" to before drop; 注:必须9i或10g以上版本支持,flashback无法恢复全文

Oracle怎么查外键建在哪个表上

怎样查外键建在哪个表上 有时候删除某张表记录的时候,会报错外键约束不能删除. 如果不了解表之间的关系,可以通过以下语句查询到外键是建在哪张表上的: select * from dba_constraints where constraint_name='xxx' and constraint_type = 'R'; 例如:我的程序日志中报如下错误,我要知道外键是在那个表上. 2015-09-08 18:28:18 [ main:261597003 ] - [ ERROR ] java.sql.S

Oracle bigfile 大文件表空间

Database 是由一个或多个被称为表空间(tablespace)的逻辑存储单位构成.表空间内的逻辑存储单位为段(segment),段又可以继续划分为数据扩展(extent).而数据扩展是由一组连续的数据块(datablock)构成. 大文件表空间 在Oracle中用户可以创建大文件表空间(bigfile tablespace).这样Oracle数据库使用的表空间(tablespace)可以由一个单一的大文件构成,而不是若干个小数据文件.这使Oracle可以发挥64位系统的能力,创建.管理超大

Oracle 数据库 数据文件 表 表空间 用户的关系

这涉及到数据库的物理结构和逻辑结构. 首先,你需要明白的一点是:数据库的物理结构是由数据库的操作系统文件所决定,每一个Oracle数据库是由三种类型的文件组成:数据文件.日志文件和控制文件.数据库的文件为数据库信息提供真正的物理存储. 每一个Oracle数据库有一个或多个物理的数据文件(data file).一个数据库的数据文件包含全部数据库数据.逻辑数据库结构(如表.索引等)的数据物理地存储在数据库的数据文件中.数据文件通常为*.dbf格式,例如:userCIMS.dbf.数据文件有下列特征:

Oracle学习笔记八 表空间

表空间 表空间是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间 . 分区表 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区.表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表. 注意:已经存在的表没有方法可以直接转化为分区表 Oracle允许用户将一个表分成多个分区,用户可以执行查询,只访问表中的特定分区,也

Oracle 11G 监控单张表的增删改操作

前言:    线上oracle数据库有张表的数据有些乱,根据应用db的log和应用的log也没有检查出来谁修改了,所以决定把这张单表做个详细的insert.update.delete监控.一:使用数据库自带的审计功能1,查看审计功能是否启动SQL> show parameter audit NAME     TYPE VALUE------------------------------------ ----------- ------------------------------audit_

实例讲解Oracle数据库设置默认表空间问题

实例讲解Oracle数据库设置默认表空间问题 实例讲解Oracle数据库设置默认表空间问题,阅读实例讲解Oracle数据库设置默认表空间问题,DBA们经常会遇到一个这样令人头疼的问题:不知道谁在Oracle上创建了一个用户,创建时,没有给这个用户指定默认表空间,所以这个用户就会采用默认的表空间——system表空 DBA们经常会遇到一个这样令人头疼的问题:不知道谁在Oracle上创建了一个用户,创建时,没有给这个用户指定默认表空间,所以这个用户就会采用默认的表空间——system表空间.导致系统

ORACLE主要的系统表和系统视图

ORACLE主要的系统表和系统视图 1.系统表 ORACLE数据库的系统参数都存储在数据库中,可以通过SQLPLUS,以用户SYS进行查询.几个重要的表或者视图如下: v$controlfile:控制文件的信息: v$datafile:数据文件的信息: v$log:日志文件的信息: v$process:处理器的信息: v$session:会话信息: v$transaction:事务信息: v$resource:资源信息: v$sga:系统全局区的信息. 上面的视图名中的‘v$’,只是视图名字中的