当前位置: 移动技术网 > IT编程>数据库>Oracle > 利用数据库触发实现复杂的安全性检查

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

2020年04月20日  | 移动技术网IT编程  | 我要评论

好奇街,最长的一天打一成语,爱上一朵花的芬芳

文章内容来自:https://www.cnblogs.com/collen7788/p/12735706.html

一、什么是触发器

数据库触发器是一个与表相关联的,存储的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语句时候的安全性检查。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网