`

【赵强老师】利用数据库触发实现复杂的安全性检查

阅读更多

一、什么是触发器

数据库触发器是一个与表相关联的,存储的PL/SQL 语句。每当一个特定的数据操作语句(insert update delete)在指定的表上发出时,Oracle自动执行触发器中定义的语句序列。

触发器的应用场景如下:

  • 复杂的安全性检查
  • 数据的确认
  • 数据库审计
  • 数据的备份和审计

 

二、创建Oracle触发器的语法

CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER }
{INSERT | DELETE | UPDATE [OF column [, column …]]}
[OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]
ON [schema.]table_name | [schema.]view_name
[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]
[FOR EACH ROW ]
[WHEN condition]
PL/SQL_BLOCK | CALL procedure_name;

 

其中:

  • BEFORE 和AFTER指出触发器的触发时序分别为前触发和后触发方式,前触发是在执行触发事件之前触发当前所创建的触发器,后触发是在执行触发事件之后触发当前所创建的触发器。
  • FOR EACH ROW选项说明触发器为行触发器。
  • 行触发器和语句触发器的区别表现在:行触发器要求当一个DML语句操走影响数据库中的多行数据时,对于其中的每个数据行,只要它们符合触发约束条件,均激活一次触发器;而语句触发器将整个语句操作作为触发事件,当它符合约束条件时,激活一次触发器。
  • 当省略FOR EACH ROW 选项时,BEFORE 和AFTER 触发器为语句触发器,而INSTEAD OF 触发器则只能为行触发器
  • REFERENCING 子句说明相关名称,在行触发器的PL/SQL块和WHEN 子句中可以使用相关名称参照当前的新、旧列值,默认的相关名称分别为OLD和NEW。触发器的PL/SQL块中应用相关名称时,必须在它们之前加冒号(:),但在WHEN子句中则不能加冒号。
  • WHEN 子句说明触发约束条件。Condition 为一个逻辑表达时,其中必须包含相关名称,而不能包含查询语句,也不能调用PL/SQL 函数。WHEN 子句指定的触发约束条件只能用在BEFORE 和AFTER 行触发器中,不能用在INSTEAD OF 行触发器和其它类型的触发器中。
  • 当一个基表被修改( INSERT, UPDATE, DELETE)时要执行的存储过程,执行时根据其所依附的基表改动而自动触发,因此与应用程序无关,用数据库触发器可以保证数据的一致性和完整性。

 

三、Oracle触发器的类型

  • 行级触发器:对DML语句影响的每个行执行一次,例如,一条update语句更新了100条数据,如果我们针对update定义了行级触发器,那么行级触发器将会被触发100次 。
  • 语句级触发器:对每个DML语句执行一次,例如,一条update语句更新了200条数据,如果我们针对update定义了语句级触发器,那么语句级触发器将会被触发1次 。

 

四、利用数据库触发实现复杂的安全性检查

/*
实施复杂的安全性检查

禁止在非工作时间插入新员工
周末:to_char(sysdate,'day') in ('星期六','星期日')
上班前和下班后:to_number(to_char(sysdate,'hh24')) not between 9 and 18 
*/
create or replace trigger securityemp
before insert
on emp
begin
  if to_char(sysdate,'day') in ('星期六','星期日') or
     to_number(to_char(sysdate,'hh24')) not between 9 and 18 then
     --禁止insert操作 抛出异常
     raise_application_error(-20001,'禁止在非工作时间插入新员工');
  end if;
end;
/

 

  • 在上面的例子中,我们禁止在非工作时间插入新员工,从而实现执行insert语句时候的安全性检查。

分享到:
评论

相关推荐

    传智播客 赵强 Oracle课件

    10. **实战项目**:通过赵强老师的课件,你将有机会参与到实际的项目中,将所学知识应用于解决实际问题,提高解决复杂数据库问题的能力。 赵强老师的Oracle课件全面覆盖了Oracle数据库的学习路径,无论你是初学者...

    赵强老师的Oracle课件

    想要好好地学习Oracle数据库的朋友呀,你错过了她就太不值得了。里面有好多的Oracle操作命令可能你都没接触过吧。好了,话不多多说。坚信资料不错!你,值得拥有!OK.还有,之所有要你2分打赏,是我给了你这么好的...

    Oracle数据库赵强视频教程【3天】

    教程名称:Oracle 数据库赵强视频教程【3天】教程目录:【】Oracle安装与管理、SQL语句(赵强)【】Orcale存储过程jdbc与Orcale大文本操作等(赵强)【】SQL简单查询触发器视图(赵强)  资源太大,传百度网盘了,链接在...

    从零开始oracle

    - **关系型数据库应用系统**:利用开发工具(如Java、Python)开发的应用程序。 - **用户**:包括最终用户、开发者和管理员等。 ##### 1.1.4 什么是关系型数据库管理系统 **数据定义语言(DDL)**:用于创建、修改...

    精通JSP编程 作者赵强

    8. **第11章** - 最后一章可能涉及JSP的安全性问题和优化技巧。读者会了解到如何防止SQL注入、XSS攻击,以及如何优化JSP性能,比如使用缓存、减少不必要的服务器往返等。 通过这本书的学习,读者不仅可以掌握JSP的...

    精通JSP编程 作者赵强 编

    精通JSP编程 作者赵强 编 12-18节

    Oracle学习笔记(传智播客 赵强)

    5. **多表查询与子查询的选择**:当两者都能实现需求时,尽量选择多表查询,因为它只需要对数据库进行一次操作,效率通常更高。 6. **处理NULL值**:在Oracle中,NULL表示无效、未指定或未知的值,它不等于空格或0...

    [1120][赵强精通JSP编程][37M]

    4. **自定义标签**:允许开发者创建自己的标签库,封装复杂的业务逻辑,提高代码的重用性。 ### 五、赵强的《精通JSP编程》书籍介绍 赵强编写的《精通JSP编程》是一本全面介绍了JSP技术的经典教材。该书不仅涵盖了...

    oracle内部培训教材(来自传智播客学员)

    Oracle支持多用户并发访问,具有高度的数据完整性和安全性,适合大型企业的复杂业务需求。 二、Oracle架构 Oracle数据库的架构包括多个组件,如数据库实例、表空间、数据文件、控制文件、重做日志文件等。数据库...

    oracle课件

    同时,了解如何使用闪回技术进行数据恢复,以及如何进行数据库的完整性和一致性检查,都是学习的重点。 最后,Oracle性能优化是提升数据库效率的关键。这可能包括SQL调优、索引策略的选择、分区技术的应用,以及...

    10天掌握MongoDB

    MongoDB是一种流行的NoSQL数据库,它以其高性能、高可用性以及易扩展的特性在现代数据库系统中占据了一席之地。本文将从NoSQL的基础概念出发,逐步深入介绍MongoDB的核心特性、架构、安装、数据操作和管理等方面的...

    day2013-0110-webLogic配置和集群(赵强).zip

    5. 安全性:设置用户角色、权限,实现基于角色的访问控制(RBAC),并可以集成LDAP(Lightweight Directory Access Protocol)进行集中身份验证。 总结,"day2013-0110-webLogic配置和集群(赵强)"这个资料包涵盖了...

    信息存储技术的发展赵强.doc

    磁盘阵列通过RAID技术实现容量和速度的提升,同时提高数据的可用性和安全性。此外,大规模集群存储如Google的存储系统,以及对等存储(P2P)网络,利用分布式存储的优势,提供大规模、低成本的数据服务。 随着硬件...

    oracle讲义

    Oracle数据库管理系统是全球广泛使用的大型关系型数据库系统之一,它为各类企业和组织提供高效的数据存储和管理解决方案。本文将深入探讨"Oracle讲义"中涉及的关键知识点,包括Oracle的体系结构、文件管理、光标、...

    LoadRunner性能测试巧匠训练营-完整版(带目录)-赵强邹伟伟

    《LoadRunner性能测试巧匠训练营》是一本深入讲解LoadRunner性能测试的教材,由赵强和邹伟伟两位专家共同编著。该资源提供的是完整版,且无需密码即可解压阅读,对于想要学习和提升LoadRunner性能测试技能的人来说,...

    java代码-46 赖赵强

    在Java编程语言的世界里,"java代码-46 赖赵强"可能是指一个特定的项目或示例,由开发者...如果`main.java`包含复杂的算法或特定的库引用,那么它将展示更高级的Java概念,如多线程、网络编程、数据库连接或框架应用。

    java代码-46赖赵强 实训2编程实现一个5位八进制数012345,求出对应的十进制数。

    以下是如何用Java实现这个转换的过程: 首先,我们需要理解八进制到十进制的转换原理。这个过程通常称为基数转换,可以通过乘权重和累加的方法完成。对于一个五位的八进制数012345,每一位的权重是2的(n-1)次方,...

Global site tag (gtag.js) - Google Analytics