数据库安全性 & 完整性

01、安全性

专有名词解释

1.数据库管理员:拥有所有对象的所有权限,根据实际情况不同的权限授予不同的用户

2.用户:拥有自己建立的对象的全部的操作权限,可以使用GRANT,把权限授予其他用户

3.角色:数据库角色是权限的集合。可以为一组具有相同权限的用户创建一个角色(例如学生成绩管理系统,同时具有修改/更新/删除/查询学生成绩权限的角色是老师),使用角色来管理数据库权限可以简化授权的过程。

4.审计:启用一个专用的审计日志(Audit Log),将用户对数据库的所有操作记录在上面;审计员利用审计日志监控数据库中的各种行为,找出非法存取数据的人、时间和内容。

  • 审计很费时间和空间

  • DBA可以根据应用对安全性的要求,灵活地打开或关闭审计功能

  • 审计功能主要用于安全性要求较高的部门

用户标识与鉴别(Identification & Authentication)

即由系统提供一定的方式让用户标识自己的名字或身份,每次用户要求进入系统时,由系统进行核对,通过鉴定后才提供机器使用权。如连接数据库时输入的用户名和密码

存取控制

存取控制机制主要包括两部分:

1.定义用户权限,并将用户权限登记到数据字典中

2.合法权限检查:每当用户发出存取数据库的操作请求后,DBMS查找数据字典,根据安全规则进行合法权限检查。

自主存取控制(Discretionary Access Control,DAC):用户对于不同的数据库对象有不同的存取权限,不同的用户对同一对象也有不同的权限,而且用户还可以将其拥有的存取权限转授给其他用户。非常灵活。主要通过SQL的GRANT语句和REVOKE语句来实现。

强制存取控制(Mandatory Access Control,MAC):每一个数据库对象被标以一定的密级,每一个用户也被授予某一个级别的许可证。对于任意一个对象,只有具有合法许可证的用户才可以存取。较为严格。

数据库安全性 & 完整性_第1张图片

授权sql语句:

GRANT <权限>[,<权限>]...
ON <对象类型> <对象名>[,<对象类型> <对象名>]…
TO <用户>[,<用户>]...
[WITH GRANT OPTION];

语义:将对指定操作对象的指定操作权限授予指定的用户。发出该GRANT语句的可以是DBA(数据库管理员),也可以是数据库对象创建者,也可以是已经拥有该权限的用户。

如果指定了WITH GRANT OPTION 子句,则获得某种权限的用户还可以把这种权限再授予其他的用户。但是不允许循环授权

GRANT SELECT ON TABLE Student TO U1; /* 把查询Student表的权限授予用户U1 */
REVOKE <权限>[,<权限>]...
ON <对象类型> <对象名>[,<对象类型> <对象名>]…
FROM <用户>[,<用户>]...[CASCADE|RESTRICT];
REVOKE UPDATE(Sno) ON TABLE Student FROM U4; /*回收用户U4修改学生学号的权限*/
强制存取控制

保证更高程度的安全性

用户不能直接感知或进行控制

适用于对数据有严格而固定密级分类的部门(例如:军队、银行的保密等级)

强制存取控制中,数据库管理系统所管理的全部实体被分为主体客体两大类:

  • 主体是系统中的活动实体,如:DBMS所管理的实际用户,代表用户的各进程

  • 客体是系统中的被动实体,受主体操纵,如:文件、基表、索引、视图

敏感度标记(Label):对于主体客体,DBMS为它们每个实例(值)指派一个敏感度标记(Label)敏感度标记分成若干级别

  • 绝密(Top Secret,TS)

  • 机密(Secret,S)

  • 可信(Confidential,C)

  • 公开(Public,P)

  • TS>=S>=C>=P

主体的敏感度标记称为许可证级别(Clearance Level)

客体的敏感度标记称为密级(Classification Level)

当一个用户以标记label注册入系统时,系统要求他对任何客体的存取必须遵循如下规则:

  • 仅当主体的许可证级别大于或等于客体的密级时,该主体才能读取相应的客体

  • 仅当主体的许可证级别小于或等于客体的密级时,该主体才能写相应的客体

注意第2点,即用户可以写入数据但是不能再读取自己写入的数据。

02、完整性

数据库完整性是指数据的正确性和相容性。完整性是为了防止数据库中存在不符合语义的数据,即防止数据库中存在不正确的数据

为了维护数据库的完整性,DBMS必须能够:

  1. 提供定义完整性约束条件的机制:完整性一般由SQL的**DDL(数据库定义语言)**语句来实现,它们作为数据库模式的一部分存入数据字典中。

  1. 提供完整性检查的方法:检查数据是否满足完整性约束条件的机制

  1. 违约处理:若用户违背了完整性约束条件,应该采取的动作

实体完整性

关系模型的实体完整性在CREATE TABLE中用PRIMARY KEY定义。一种是定义为列级约束条件,另一种是定义为表级约束条件

   CREATE TABLE Student (
   Sno CHAR(9) PRIMARY KEY, /*在列级定义主码*/
   Sname CHAR(20) NOT NULL,
   Ssex CHAR(2),  Sage SMALLINT,  Sdept CHAR(20)
   );
   CREATE TABLE Student 
   Sno CHAR(9) ,
   Sname CHAR(20) NOT NULL,   Ssex CHAR(2),   Sage SMALLINT,   Sdept CHAR(20)
   PRIMARY KEY(Sno)  /*在表级定义主码*/
   );
   CREATE TABLE Student (
   Sno CHAR(9) ,Sname CHAR(20) NOT NULL,  Ssex CHAR(2),
   Sage SMALLINT,  Sdept CHAR(20)
   PRIMARY KEY(Sno,Sname)  /*属性组定义为主码,只能在表级定义*/
   );

违约处理:

当用户程序对基本表插入一条记录或对主码列进行更新操作时,会进行如下检查

(1)检查主码值是否唯一,如果不唯一则拒绝插入或修改

(2)检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改

参照完整性

关系模型的参照完整性在CREATE TABLE中用FOREIGN KEY短语定义哪些列为外码,用REFERENCES短语指明这些外码参照哪些表的主码。

例如,关系SC中一个元组表示一个学生选修的某门课程的成绩,(Sno,Cno)是主码。Sno、Cno分别参照引用Student表的主码和Course表的主码

   CREATE TABLE SC (
   Sno CHAR(9) NOT NULL,
   Cno CHAR(4) NOT NULL,
   Grade SMALLINT,
   PRIMARY KEY(Sno, Cno),
   FOREIGN KEY(Sno) REFERENCES Student(Sno),
   FOREIGN KEY(Cno) REFERENCES Course(Cno)    /*在表级定义参照完整性*/
   );

违约检查:

对被参照表和参照表进行增删改操作时都会进行检查

数据库安全性 & 完整性_第2张图片

当不一致发生时,系统可以采用如下策略处理:

(1)拒绝(NO ACTION)执行:不允许该操作执行,该策略一般设置为默认策略

(2)级联(CASCADE)操作:当删除或修改被参照表的一个元组导致与参照表(SC)的不一致时,删除或修改参照表中的所有导致不一致的元组。

(3)设置为空值:当删除或修改被参照表的一个元组时造成了不一致,则将参照表中所有造成不一致的元组的对应属性设置为空值。

如果要采取非默认策略需要显式地加以说明,如:

ON DELETE NO ACTION

ON UPDATE CASCADE

用户自定义完整性

1.属性上的约束条件的定义

NULL/NOT NULL、DEFAULT,UNIQUE、CHECK

  • 列值非空(NOT NULL)

  • 列值唯一(UNIQUE)

2.元组上的约束条件

使用CHECK短语定义元组上的约束条件,如下:

   CREATE TABLE SC (
   Sno CHAR(9) NOT NULL,
   Cno CHAR(4) NOT NULL,
   Grade SMALLINT,
   PRIMARY KEY(Sno, Cno),
   CHECK(Sno='x' OR Cno NOT LIKE 'MS.%')
   );

违约处理:拒绝执行

触发器(Trigger)

触发器是用户定义在关系表上的一类由事件驱动的特殊过程,其不仅可以用于数据库完整性检查,也可以用来实现数据库的其他功能,包括数据库安全性,以及一些业务流程和控制流程。

定义触发器:

CREATE TRIGGER <触发器名>    /*每当触发事件发生时,该触发器被激活*/
{BEFORE | AFTER} <触发事件> ON <表名> /*指明触发器激活的时间是在执行触发事件前或后*/
REFERENCING NEW|OLD ROW AS <变量> /*REFERENCING 指出引用的变量*/
FOR EACH {ROW | STATEMENT}             /*定义触发器的类型,指明动作体执行的频率*/
[WHEN <触发条件> ]                         /*仅当触发条件为真时才执行触发动作体*/
<触发动作体>  

要点:

  1. 只有创建表的用户才可以在表上创建触发器,并且一个表上只能创建一定数量的触发器

  1. 触发器名唯一

  1. 触发器只能定义在基本表上,不能定义在视图上

  1. 触发事件可以是INSERT DELETE 或 UPDATE,也可以是这几个事件的组合,如INSERT OR DELETE等,还可以是UPDATE OF <触发列, …>指明修改哪些列时激活触发器

  1. AFTER / BEFORE 是触发的时机,AFTER表示在触发事件的操作执行之后激活触发器。

  1. 触发器类型:FOR EACH ROW(行级触发器)和FOR EACH STATEMENT(语句触发器),假设表TEACHAR 有1000行,行级触发器将执行1000次,而语句触发器只执行1次

  1. 触发条件:触发器被激活时,只有当触发条件为真时触发动作体才执行;否则触发动作体不执行。如果省略WHEN触发条件,则触发动作体在触发器激活后立即执行。

  1. 触发动作体:在过程体中可以使用NEW和OLD来引用UPDATE/INSERT事件之后的新值和之前的旧值,如果是语句级触发器则不能使用NEW或OLD引用。

多个执行语句的触发器:

CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件
ON 表名 FOR EACH ROW
BEGIN
执行语句列表
END

CREATE TRIGGER Insert_Or_Update_Sal
  BEFORE INSERT OR UPDATE ON Teacher
  FOR EACH ROW
  AS BEGIN
 IF (new.Job = ‘教授’) AND (new.Sal < 4000) THEN
 new.Sal := 4000;
   END IF;
  END;
删除触发器:DROP TRIGGER <触发器名> ON <表名>

你可能感兴趣的:(MySQL,mysql)