数据库 - 触发器与域中的完整性限制

域中的完整性限制

SQL支持域的概念,并可以用CREATE DOMAIN语句建立一个域以及该域应该满足的完整性约束条件。
[例14]建立一个性别域,并声明性别域的取值范围
           CREATE DOMAIN GenderDomain CHAR(2)
           CHECK (VALUE IN (‘男‘,‘女‘) );
          这样[例10]中对Ssex的说明可以改写为
          Ssex GenderDomain
[例15]建立一个性别域GenderDomain,并对其中的限制命名
           CREATE DOMAIN GenderDomain CHAR(2)
           CONSTRAINT GD CHECK ( VALUE IN (‘男‘,‘女‘) );
[例16]删除域GenderDomain的限制条件GD。
           ALTER  DOMAIN  GenderDomain
           DROP CONSTRAINT GD;
[例17]在域GenderDomain上增加限制条件GDD。
          ALTER  DOMAIN  GenderDomain
         ADD CONSTRAINT GDD CHECK (VALUE IN ( ‘1‘,‘0‘) );
通过[例16]和[例17],就把性别的取值范围由(‘男‘,‘女‘)改为 ( ‘1‘,‘0‘)

触发器(Trigger)

触发器(Trigger)是用户定义在关系表上的一类由事件驱动的特殊过程

由服务器自动激活

可以进行更为复杂的检查和操作,具有更精细和更强大的数据控制能力

定义触发器

CREATE TRIGGER语法格式

      CREATE TRIGGER <触发器名>
       {BEFORE | AFTER} <触发事件> ON <表名>
        FOR EACH  {ROW | STATEMENT}
      [WHEN <触发条件>]
        <触发动作体>

定义触发器的语法说明:

1. 创建者:表的拥有者

2. 触发器名

3. 表名:触发器的目标表

4. 触发事件:INSERT、DELETE、UPDATE

5. 触发器类型

行级触发器(FOR EACH ROW)

语句级触发器(FOR EACH STATEMENT)

例如,假设在[例11]的TEACHER表上创建了一个AFTER UPDATE触发器。如果表TEACHER有1000行,执行如下语句:
    UPDATE TEACHER SET Deptno=5;
如果该触发器为语句级触发器,那么执行完该语句后,触发动作只发生一次
如果是行级触发器,触发动作将执行1000次
  1. 触发条件

    触发条件为真

    省略WHEN触发条件

  2. 触发动作体

    触发动作体可以是一个匿名PL/SQL过程块

    也可以是对已创建存储过程的调用

[例18]  定义一个BEFORE行级触发器,为教师表Teacher定义完整性规则“教授的工资不得低于4000元,如果低于4000元,自动改为4000元”。
    CREATE TRIGGER Insert_Or_Update_Sal
         BEFORE INSERT OR UPDATE ON Teacher
        /*触发事件是插入或更新操作*/
         FOR EACH ROW                      /*行级触发器*/
        AS BEGIN                                  /*定义触发动作体,是PL/SQL过程块*/
              IF (new.Job=‘教授‘) AND (new.Sal < 4000) THEN
              new.Sal :=4000;
              END IF;
        END;                               
[例19]定义AFTER行级触发器,当教师表Teacher的工资发生变化后就自动在工资变化表Sal_log中增加一条相应记录
   首先建立工资变化表Sal_log
    CREATE TABLE Sal_log
        (Eno    NUMERIC(4)  references teacher(eno),
          Sal     NUMERIC(7,2),
          Username  char(10),
          Date   TIMESTAMP
         );
[例19](续)
CREATE TRIGGER Insert_Sal
    AFTER INSERT ON Teacher         /*触发事件是INSERT*/
    FOR EACH ROW
    AS BEGIN
        INSERT INTO Sal_log VALUES(
           new.Eno,new.Sal,CURRENT_USER,CURRENT_TIMESTAMP);
    END;
[例19](续)
CREATE TRIGGER Update_Sal
   AFTER UPDATE ON Teacher      /*触发事件是UPDATE */
   FOR EACH ROW
   AS BEGIN
     IF (new.Sal <> old.Sal) THEN INSERT INTO Sal_log VALUES(
          new.Eno,new.Sal,CURRENT_USER,CURRENT_TIMESTAMP);
     END IF;
  END;

激活触发器

触发器的执行,是由触发事件激活的,并由数据库服务器自动执行

一个数据表上可能定义了多个触发器

同一个表上的多个触发器激活时遵循如下的执行顺序:

(1) 执行该表上的BEFORE触发器;

(2) 激活触发器的SQL语句;

(3) 执行该表上的AFTER触发器。

[例20]执行修改某个教师工资的SQL语句,激活上述定义的触发器。
     UPDATE Teacher SET Sal=800 WHERE Ename=‘陈平‘;
    执行顺序是:
执行触发器Insert_Or_Update_Sal
执行SQL语句“UPDATE Teacher SET Sal=800 WHERE Ename=‘陈平‘;”
执行触发器Insert_Sal;
执行触发器Update_Sal

删除触发器

删除触发器的SQL语法:

DROP TRIGGER <触发器名> ON <表名>;

触发器必须是一个已经创建的触发器,并且只能由具有相应权限的用户删除。

[例21]  删除教师表Teacher上的触发器Insert_Sal
     DROP TRIGGER Insert_Sal ON Teacher;

数据库的完整性是为了保证数据库中存储的数据是正确的

RDBMS完整性实现的机制

完整性约束定义机制

完整性检查机制

违背完整性约束条件时RDBMS应采取的动作

时间: 2024-08-03 19:00:50

数据库 - 触发器与域中的完整性限制的相关文章

Sql Server 因为触发器问题导致数据库更新报错“在触发器执行过程中引发了错误,批处理已中止”的问题处理

在维护一个非常旧的项目时,由于该项目版本已经非常老了,而且在客户现场运行的非常稳定,更要命的是本人目前没有找到该项目的代码,为了处理一个新的需求而且还不能修改程序代码,于是决定从数据库入手,毕竟该项目数据库的脚本还是可以操作的,那就在数据流的必经之路上拦截数据处理业务就是了,于是决定在一张业务表上加一个触发器,关于触发器的基础这里就不多说了,网上一搜一大堆,其实就是一张表的数据行被操作以后会针对被操作的数据行执行一段存储过程脚本,只不过这个存储过程比较特殊罢了,是专门侦听对表的操作然后由系统调用

数据库-- 触发器

触发器是特殊的存储过程,它的执行不由程序调用,也不是手动启动,而是由事件来触发,比如当对一个表进行操作(INSERT.UPDATE.DELETE等,不包括SEARCH)时就会被激活,从而执行.另外一个与存储过程不同的地方在于,存储过程更多的是为了返回数据,而触发器更多的作用是维护数据完整性.所以触发器经常用于加强数据的完整性约束和业务规则等. 触发器有三种常规的类型:DML触发器.DDL触发器和登陆触发器. DDL触发器:当服务器或数据库中发生数据定义语言(DDL)事件时会调用DDL触发器. 登

【赵强老师】利用数据库触发器实现数据的同步

一.什么是触发器 数据库触发器是一个与表相关联的,存储的PL/SQL 语句.每当一个特定的数据操作语句(insert update delete)在指定的表上发出时,Oracle自动执行触发器中定义的语句序列. 触发器的应用场景如下: 复杂的安全性检查 数据的确认 数据库审计 数据的备份和审计 二.创建Oracle触发器的语法 CREATE [OR REPLACE] TRIGGER trigger_name {BEFORE | AFTER } {INSERT | DELETE | UPDATE

JetBrains发布DataGrip 1.0——数据库与SQL领域中的瑞士军刀

本文来源于我在InfoQ中文站翻译的文章,原文地址是:http://www.infoq.com/cn/news/2015/12/datagrip-released 近日,来自捷克的软件公司JetBrains发布了全新的重量级产品DataGrip 1.0--号称数据库与SQL领域中的瑞士军刀.DataGrip的前身0xDBE已经发布一年多的时间了,这也是JetBrains向广大用户提供的开发版本,每个版本都有一定的使用期限,过期后用户可以从JetBrains网站上下载新的开发版本.经过了长时间的开

数据库触发器详讲

一:触发器的概念: 数据库触发器是一个与表相关联的,存储的plsql语句. 作用:每当一个特定的数据操作语句,(insert,update,delete)在指定的表发出时,Oracle自动地执行触发器中定义的语句序列 第一个触发器:每当成功插入新员工后   自动打印“插入新员工成功” create trigger 触发器名字(saynewemp) after (执行操作之后) insert on 操作的表(emp) declare begin dbms_output.put_line('成功插入

在域中获取域管理员权限的多种方法及一些缓解措施

翻译:hac425 前言 现在攻击者有很多方法可以用来获取域管理员权限.这篇文章的目的是介绍一些当前较受欢迎的方式.这里所介绍的技术的基本点是攻击者已经拿到了一台域中的服务器,并已获得域用户凭据. 对大多数企业来说有一个不幸的现实:对于一个攻击者来说,从域用户权限提升到域管理员权限往往不需要太长的时间.为什么会这样呢?本文会介绍其中使用的一些技巧. 现在针对一个企业,组织的攻击越来越频繁通过一些钓鱼手法来开始.比如通过发送大量的钓鱼邮件给目标的成员来在目标网络的机器上执行代码.一旦攻击者能够在企

在不同域中各个系统拥有自已独立的用户系统时的单点登录问题

我们在实现业务中经常会碰到多个系统各自有各自的用户登录系统,而且这些系统是各自运行在各自的域下,所以要实现这些系统用户的单点登录就是个问题了,所以自己想了一个方案希望看看是否可行. 1.sso站点必须是单独一个站点. 我把sso单独设立一下站点,这个站点可以单独一个域名,主要存放各个系统的用户信息及登录的cookie信息. 2.保证各个系统的用户数据一致性和独立性. 各个系统拥有自己的用户数据表相互独立.每一个系统的CUD(创建,更新,删除)时都会触发其它系统的CUD.那么这里有个问题也会出现:

ORACLE数据库触发器【转载】

ORACLE 触发器其实是PL/SQL块,它类似于存储过程和函数,不过有一点不同的是,触发器是隐式调用的,并不能接收参数.    ORACLE触发器有三种类型,分别是:DML触发器, 替代触发器和系统触发器. 下面对这三种类型一一进行讲述 1.DML触发器 顾名思义,DML触发器是由DML语句触发的.例如数据库的INSERT/UPDATE/DELETE操作都可以触发该类型的触发器. 它们可以在这些语句之前或之后触发,或者在行级上触发(就是说对于每个受影响的行都触发一次) 例如我们有一张表TABL

域中Win7客户端无法使用键盘鼠标唤醒屏幕(组策略排错)

用户域中设置了屏幕锁定的策略,并且已经稳定的运行数年,最近部分Win7客户端出现了一些奇怪的问题,客户端实行了这条域策略后屏幕无法使用鼠标或者键盘唤醒,正常情况下只要活动鼠标或键盘就可以进行密码输入,更郁闷的是一些用户不懂如何解决这样的问题,直接重启计算机造成了有的数据丢失,还好这个不怪我 域策略是对用户生效的,如果加入域的计算机使用本地账户登录也不会出现这种问题,所以跟策略还是有一定的关系 ===问题客户端 下图就是我滑动鼠标后出现的现象,正常情况下可以直接输入密码进入系统的 现在我的鼠标可以