- 浏览: 7943573 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (2425)
- 软件工程 (75)
- JAVA相关 (662)
- ajax/web相关 (351)
- 数据库相关/oracle (218)
- PHP (147)
- UNIX/LINUX/FREEBSD/solaris (118)
- 音乐探讨 (1)
- 闲话 (11)
- 网络安全等 (21)
- .NET (153)
- ROR和GOG (10)
- [网站分类]4.其他技术区 (181)
- 算法等 (7)
- [随笔分类]SOA (8)
- 收藏区 (71)
- 金融证券 (4)
- [网站分类]5.企业信息化 (3)
- c&c++学习 (1)
- 读书区 (11)
- 其它 (10)
- 收藏夹 (1)
- 设计模式 (1)
- FLEX (14)
- Android (98)
- 软件工程心理学系列 (4)
- HTML5 (6)
- C/C++ (0)
- 数据结构 (0)
- 书评 (3)
- python (17)
- NOSQL (10)
- MYSQL (85)
- java之各类测试 (18)
- nodejs (1)
- JAVA (1)
- neo4j (3)
- VUE (4)
- docker相关 (1)
最新评论
-
xiaobadi:
jacky~~~~~~~~~
推荐两个不错的mybatis GUI生成工具 -
masuweng:
(转)JAVA获得机器码的实现 -
albert0707:
有些扩展名为null
java 7中可以判断文件的contenttype了 -
albert0707:
非常感谢!!!!!!!!!
java 7中可以判断文件的contenttype了 -
zhangle:
https://zhuban.me竹板共享 - 高效便捷的文档 ...
一个不错的网络白板工具
http://www.eygle.com/archives/2004/12/use_trigger_to_implement_ddl_deny.html
不管是有意还是无意的,你可能会遇到数据库中重要的数据表等对象被drop掉的情况,这可能会给我们带来巨大的损失.
通过触发器,我们可以实现对于表等对象的数据库级守护,禁止用户drop操作.
以下是一个简单的范例,供参考:
REM this script can be used to monitor a object
REM deny any drop operation on it.
CREATE OR REPLACE TRIGGER trg_dropdeny
BEFORE DROP ON DATABASE
BEGIN
IF LOWER (ora_dict_obj_name ()) = 'test'
THEN
raise_application_error (num => -20000,
msg => '你疯了,想删除表 '
|| ora_dict_obj_name ()
|| ' ?!!!!!'
|| '你完了,警察已在途中.....'
);
END IF;
END;
/
测试效果:
SQL> connect scott/tiger
Connected.
SQL> create table test as select * from dba_users;
Table created.
SQL> connect / as sysdba
Connected.
SQL> create or replace trigger trg_dropdeny
2 before drop on database
3 begin
4 if lower(ora_dict_obj_name()) = 'test'
5 then
6 raise_application_error(
7 num => -20000,
8 msg => '你疯了,想删除表 ' || ora_dict_obj_name() || ' ?!!!!!' ||'你完了,警察已在途中.....');
9 end if;
10 end;
11 /
Trigger created.
SQL> connect scott/tiger
Connected.
SQL> drop table test;
drop table test
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-20000: 你疯了,想删除表 TEST ?!!!!!你完了,警察已在途中.....
ORA-06512: at line 4
Oracle从Oracle8i开始,允许实施DDL事件trigger,可是实现对于DDL的监视及控制,以下是一个进一步的例子:
create or replace trigger ddl_deny
before create or alter or drop or truncate on database
declare
l_errmsg varchar2(100):= 'You have no permission to this operation';
begin
if ora_sysevent = 'CREATE' then
raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
elsif ora_sysevent = 'ALTER' then
raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
elsif ora_sysevent = 'DROP' then
raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
elsif ora_sysevent = 'TRUNCATE' then
raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
end if;
exception
when no_data_found then
null;
end;
/
我们看一下效果:
[oracle@jumper tools]$ sqlplus "/ as sysdba"
SQL*Plus: Release 9.2.0.4.0 - Production on Sun Oct 31 11:38:25 2004
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning option
JServer Release 9.2.0.4.0 - Production
SQL> set echo on
SQL> @ddlt
SQL> create or replace trigger ddl_deny
2 before create or alter or drop or truncate on database
3 declare
4 l_errmsg varchar2(100):= 'You have no permission to this operation';
5 begin
6 if ora_sysevent = 'CREATE' then
7 raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
8 elsif ora_sysevent = 'ALTER' then
9 raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
10 elsif ora_sysevent = 'DROP' then
11 raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
12 elsif ora_sysevent = 'TRUNCATE' then
13 raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
14 end if;
15
16 exception
17 when no_data_found then
18 null;
19 end;
20 /
Trigger created.
SQL>
SQL>
SQL> connect scott/tiger
Connected.
SQL> create table t as select * from test;
create table t as select * from test
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-20001: SCOTT.T You have no permission to this operation
ORA-06512: at line 5
SQL> alter table test add (id number);
alter table test add (id number)
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-20001: SCOTT.TEST You have no permission to this operation
ORA-06512: at line 7
SQL> drop table test;
drop table test
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-20001: SCOTT.TEST You have no permission to this operation
ORA-06512: at line 9
SQL> truncate table test;
truncate table test
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-20001: SCOTT.TEST You have no permission to this operation
ORA-06512: at line 11
我们可以看到,ddl语句都被禁止了,如果你不是禁止,可以选择把执行这些操作的用户及时间记录到另外的临时表中.以备查询.
不管是有意还是无意的,你可能会遇到数据库中重要的数据表等对象被drop掉的情况,这可能会给我们带来巨大的损失.
通过触发器,我们可以实现对于表等对象的数据库级守护,禁止用户drop操作.
以下是一个简单的范例,供参考:
REM this script can be used to monitor a object
REM deny any drop operation on it.
CREATE OR REPLACE TRIGGER trg_dropdeny
BEFORE DROP ON DATABASE
BEGIN
IF LOWER (ora_dict_obj_name ()) = 'test'
THEN
raise_application_error (num => -20000,
msg => '你疯了,想删除表 '
|| ora_dict_obj_name ()
|| ' ?!!!!!'
|| '你完了,警察已在途中.....'
);
END IF;
END;
/
测试效果:
SQL> connect scott/tiger
Connected.
SQL> create table test as select * from dba_users;
Table created.
SQL> connect / as sysdba
Connected.
SQL> create or replace trigger trg_dropdeny
2 before drop on database
3 begin
4 if lower(ora_dict_obj_name()) = 'test'
5 then
6 raise_application_error(
7 num => -20000,
8 msg => '你疯了,想删除表 ' || ora_dict_obj_name() || ' ?!!!!!' ||'你完了,警察已在途中.....');
9 end if;
10 end;
11 /
Trigger created.
SQL> connect scott/tiger
Connected.
SQL> drop table test;
drop table test
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-20000: 你疯了,想删除表 TEST ?!!!!!你完了,警察已在途中.....
ORA-06512: at line 4
Oracle从Oracle8i开始,允许实施DDL事件trigger,可是实现对于DDL的监视及控制,以下是一个进一步的例子:
create or replace trigger ddl_deny
before create or alter or drop or truncate on database
declare
l_errmsg varchar2(100):= 'You have no permission to this operation';
begin
if ora_sysevent = 'CREATE' then
raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
elsif ora_sysevent = 'ALTER' then
raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
elsif ora_sysevent = 'DROP' then
raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
elsif ora_sysevent = 'TRUNCATE' then
raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
end if;
exception
when no_data_found then
null;
end;
/
我们看一下效果:
[oracle@jumper tools]$ sqlplus "/ as sysdba"
SQL*Plus: Release 9.2.0.4.0 - Production on Sun Oct 31 11:38:25 2004
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning option
JServer Release 9.2.0.4.0 - Production
SQL> set echo on
SQL> @ddlt
SQL> create or replace trigger ddl_deny
2 before create or alter or drop or truncate on database
3 declare
4 l_errmsg varchar2(100):= 'You have no permission to this operation';
5 begin
6 if ora_sysevent = 'CREATE' then
7 raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
8 elsif ora_sysevent = 'ALTER' then
9 raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
10 elsif ora_sysevent = 'DROP' then
11 raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
12 elsif ora_sysevent = 'TRUNCATE' then
13 raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
14 end if;
15
16 exception
17 when no_data_found then
18 null;
19 end;
20 /
Trigger created.
SQL>
SQL>
SQL> connect scott/tiger
Connected.
SQL> create table t as select * from test;
create table t as select * from test
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-20001: SCOTT.T You have no permission to this operation
ORA-06512: at line 5
SQL> alter table test add (id number);
alter table test add (id number)
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-20001: SCOTT.TEST You have no permission to this operation
ORA-06512: at line 7
SQL> drop table test;
drop table test
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-20001: SCOTT.TEST You have no permission to this operation
ORA-06512: at line 9
SQL> truncate table test;
truncate table test
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-20001: SCOTT.TEST You have no permission to this operation
ORA-06512: at line 11
我们可以看到,ddl语句都被禁止了,如果你不是禁止,可以选择把执行这些操作的用户及时间记录到另外的临时表中.以备查询.
发表评论
-
mybatis generator中的字段大小写生成问题
2017-10-22 19:35 11404mybatis generator插件中,如果 mysql数据 ... -
MySQL统计一个列中不同值的数量
2017-07-11 14:04 16293https://yiqiwuliao.com/post/mys ... -
mysql 1449 : The user specified as a definer ('root'@'%') does not exist 解决方法
2017-03-02 09:44 1801权限问题,授权 给 root 所有sql 权限 mysql ... -
几个不错的MYSQL 优化TIPS
2016-11-19 12:30 816图片来自http://imysql.com/的PDF分享 [ ... -
powerdesign 逆向ORACLE的坑
2016-09-27 17:08 573要注意的是,在WIN 64中,如果要用powerdesin 来 ... -
( 转)mysql中删除两条重复记录中的一条
2015-10-19 20:19 1335| id | createTime | labId | pub ... -
mysql中sql语句=,>的时候的索引设置
2015-05-02 12:27 1312在 https://www.percona.com/blog/ ... -
mysql中profile的使用
2015-04-30 11:11 2236mysql 的 sql 性能分析器主要用途是显示 sql 执行 ... -
mysql中的sql mode
2015-04-13 11:29 1160mysql sql mode小结 1 sql mode可以 ... -
PROCEDURE ANALYSE()为mysql提高性能提供建议
2015-04-02 16:37 1476procedure analyse();语法如下 select ... -
mongodb中意外退出的问题
2015-02-11 14:32 1343mongodb启动的时候,意外退出: Unclean shut ... -
mysql 5.5中保留字查询
2014-06-05 23:16 1492mysql 5.5中保留字查询 http://www.5is ... -
(转)oracle 临时表空间的增删改查
2014-03-18 12:44 1149oracle 临时表空间的增删改查 1、查看临时表空间 (d ... -
pl-sql developer安装
2014-02-07 09:16 1137一直都是机器本机上有oracle,所以装pl sql deve ... -
oracle中的nvl,nvl2等参数
2013-12-26 11:18 22871.nul函数将一个null值转换为一个实际的值。 数据类型可 ... -
Oracle中的ROWNUM rowid 以及MySQL中实现rownum功能类似的语句
2013-12-26 11:08 2366http://gong-10140.iteye.com/blo ... -
ORACLE XE版本的限制
2013-12-07 08:11 367710g中用户数据最大为4G, 11G中最大为11G,如果超出大 ... -
oracle中监控索引是否可用
2013-11-04 07:22 1086在oracle中,可以使用如下的方法监控索引是否可用: a ... -
mysql 5.6中的时间类型的新精度介绍
2013-10-28 09:33 8420留意到mysql 5.6中,可以使用select now(6) ... -
<<oracle索引技术》读书笔记1
2013-08-25 16:23 1331expert indexing in oracle datab ...
相关推荐
这款数据库系统广泛应用于企业级数据存储和处理,支持复杂的事务处理、数据仓库以及互联网应用。中文文档的提供对于中国用户来说非常友好,能够帮助读者更好地理解和操作Oracle 11g。 文档通常会包含以下几个核心...
- **高可用性**:了解RAC(Real Application Clusters)和数据守护等技术,实现数据库的高可用性和故障切换。 - **数据库设计**:学习如何进行规范化设计,减少数据冗余和异常,提高数据一致性。 以上只是Oracle...
2. **SQL支持**:MySQL实现了SQL标准,使得数据库操作简单且灵活。 3. **高性能**:MySQL设计的目标是快速响应,即使处理大量数据也能保持高效。 4. **易用性**:MySQL的安装和使用相对简单,适合各种规模的应用场景...
这可能涉及到用户权限的精细控制,使用角色和权限分离原则,以及实施数据库复制、数据守护或Real Application Clusters (RAC)来实现故障切换和负载均衡。 总的来说,这份Oracle实验报告可能详细记录了上述各方面的...
了解SQL的DML(数据操纵语言)、DDL(数据定义语言)和DCL(数据控制语言)对于数据库操作至关重要。 3. **表空间与数据文件**:在Oracle中,数据存储在表空间中,表空间由一个或多个数据文件组成。通过管理表空间...
Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其在企业级数据存储、管理和处理方面具有卓越性能。"Oracle学习教案"旨在为初学者提供全面、深入的Oracle知识体系,帮助他们从零开始掌握这一强大的数据库...
3. **PL/SQL编程**:Oracle特有的PL/SQL是一种过程化语言,用于编写存储过程、函数、触发器等数据库级程序。学员会学习变量声明、流程控制、异常处理、游标、包等PL/SQL特性。 4. **数据库设计**:良好的数据库设计...
Oracle是世界上最广泛使用的数据库管理系统之一,尤其在企业级应用中占据主导地位。"东方标准Oracle内部教程"无疑是一份极具价值的学习资料,旨在帮助读者深入理解Oracle的核心概念、功能以及最佳实践。本教程可能...
Oracle数据库是关系型数据库管理系统(RDBMS)的代表,其强大的数据处理能力和安全性使其在企业级应用中占据主导地位。Oracle11g引入了许多新特性,如自动存储管理(ASM)、实时应用集群(RAC)、数据守护(Data ...
Oracle Database 11g是Oracle公司推出的一款关系型数据库管理系统,是企业级数据管理的首选平台,广泛应用于各种规模的企业和组织。对于初学者来说,理解并掌握Oracle Database 11g的基础知识至关重要,这将为未来在...
6. **SQL 和 PL/SQL**:深入理解 SQL 语言,包括 DDL、DML、DDL 和 DCL 操作,以及 PL/SQL 存储过程、函数、触发器等高级特性。 在提供的压缩包文件中,`053新题01.pdf` 和 `053新题02.pdf` 可能包含了这些主题的...
Oracle大学的课件主要涵盖了数据库管理、SQL语言、数据库设计、性能优化以及系统管理等多个方面的内容,这些都是构建和维护高效企业级数据库所必备的知识。Oracle数据库是全球最广泛使用的数据库管理系统之一,尤其...
Oracle数据库是全球最广泛使用的商业关系型数据库管理系统之一,由美国甲骨文公司(Oracle Corporation)开发和维护。本课件旨在帮助学习者深入理解Oracle的核心概念和技术,以提升数据库管理、开发和优化的能力。 ...
- **审计**:实现数据库级别的审计,跟踪敏感操作。 - **网络安全**:理解监听器、TNS(透明网络寻址)配置,以及防火墙设置。 5. **高可用性**: - **RAC(实时应用集群)**:了解 RAC 的架构,如何配置和管理 ...
5. **DM8数据守护与读写分离集群V4.0.pdf**:这部分内容专注于数据库高可用性和负载均衡,讲述了如何设置数据守护以保证服务不间断,以及实现读写分离来提升系统性能。 6. **DM8系统包使用手册.pdf**:讲解了DM8...
6. 触发器和存储过程:触发器是预定义的数据库事件响应程序,可以在特定操作发生时自动执行。存储过程是一组预编译的SQL语句,可以封装复杂的业务逻辑,提高代码复用和执行效率。 7. 安全性:Oracle提供了用户、...
Oracle是一款广泛应用的关系型数据库管理系统,尤其在企业级数据存储和处理中占据重要地位。以下将详细介绍Oracle学习的一些关键知识点: 1. **Oracle概述**:Oracle是由甲骨文公司开发的数据库管理系统,支持多种...
Oracle数据库是全球最广泛使用的商业关系型数据库管理系统之一,尤其在企业级应用中占据着重要地位。清华大学作为国内顶级学府,其Oracle培训资料无疑涵盖了这个领域的核心知识和实践经验。以下将详细介绍这些资料...
最后,书中还讨论了一些高级特性,如实时应用集群(RAC)、数据守护(DG)、Exadata硬件优化等,这些内容对于大型企业级数据库的高可用性和扩展性具有重要意义。 总的来说,《Oracle精髓(第四版)》是一部全面且深入的...