《数据库安全性与完整性》由会员分享,可在线阅读,更多相关《数据库安全性与完整性(82页珍藏版)》请在金锄头文库上搜索。
1、第7章 数据库完整性 和安全性,7.1 数据库完整性,数据库的完整性是指: 数据的正确性、有效性和相容性 例: 学生的学号必须唯一; 性别只能是男或女; 学生所在的专业必须是学校已开设的专业。,为维护数据库的完整性,DBMS必须,1.提供定义完整性约束条件的机制 2.提供完整性检查的方法 3.违约处理,7.1.1 实体完整性,1 实体完整性定义,关系模型的实体完整性 CREATE TABLE中用PRIMARY KEY定义 单属性构成的码有两种说明方法 定义为列级约束条件 定义为表级约束条件 对多个属性构成的码只有一种说明方法 定义为表级约束条件,【例7.1】将Product表中的pdID属性定
2、义为主码。CREATE TABLE Product(pdID INT PRIMARY KEY, /*定义为列级约束条件*/ pdName VARCHAR(40) NOT NULL,pdSupplier VARCHAR(20),pdPrice MONEY);,定义为列级约束条件,或者: CREATE TABLE Product(pdID INT, pdName VARCHAR(40) NOT NULL,pdSupplier VARCHAR(20),pdPrice MONEY,PRIMARY KEY(pdID);/*定义为表级约束条件*/,【例7.2】将OrderDetails表中的orderID
3、,pdID属性组定义为主码。 CREATE TABLE OrderDetails(orderID BIGINT,pdID INT, quantity INT,PRIMARY KEY(orderID,pdID); /*只能定义为表级约束条件*/,在表级定义主码,2 实体完整性检查和违约处理,插入或对主码列进行更新操作时,RDBMS按照实体完整性规则自动进行检查。包括:检查主码值是否唯一,如果不唯一则拒绝插入或修改检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改,7.1.2 参照完整性,1 参照完整性定义,关系模型的参照完整性定义 在CREATE TABLE中用FOREIGN KEY短语
4、定义哪些列为外码 用REFERENCES短语指明这些外码参照哪些表的主码,【例7.3】定义OrderDetails表中的参照完整性。 CREATE TABLE OrderDetails(orderID BIGINT,pdID INT, quantity INT,PRIMARY KEY(orderID,pdID),FOREIGN KEY(orderID) REFERENCES Orders(orderID),/*定义参照完整性*/FOREIGN KEY(pdID) REFERENCES Product(pdID);/*定义参照完整性*/,2 参照完整性检查和违约处理,可能破坏参照完整性的情况及违
5、约处理,CREATE TABLE OrderDetails(orderID BIGINT,pdID INT, quantity INT,PRIMARY KEY(orderID,pdID),FOREIGN KEY(orderID) REFERENCES Orders(orderID)ON DELETE CASCADE /*当删除Orders表中的元组时,级联删除OrderDetails 表中相应的元组*/ON UPDATE CASCADE, /*当更新Orders表中的元组时,级联更新OrderDetails 表中相应的元组*/FOREIGN KEY(pdID) REFERENCES Produ
6、ct(pdID)ON DELETE NO ACTION /*当删除Product表中的元组造成OrderDetails表不一致是拒绝执行*/,【例7.4】 在定义OrderDetail表时指定违约处理策略。,7.1.3 用户定义的完整性,用户定义的完整性就是针对某一具体应用的数据必须满足的语义要求 RDBMS提供,而不必由应用程序承担,1 属性上的约束条件的定义,CREATE TABLE时定义 列值非空(NOT NULL) 列值唯一(UNIQUE) 检查列值是否满足一个布尔表达式(CHECK),【例7.5】建立Customer表,指定custName和custCity列不允许取空值。 CREA
7、TE TABLE Customer(custID INT PRIMARY KEY, custName VARCHAR(40) NOT NULL, /* custName列不允许取空值*/custCity CHAR(16) NOT NULL, /* custCity列不允许取空值*/custPhone VARCHAR(12);,1.不允许取空值,【例7.6】建立Suppliers表,指定suppName列取值唯一,suppCity列不允许取空值。 CREATE TABLE Suppliers(suppID INT PRIMARY KEY, suppName VARCHAR(40) UNIQUE,
8、 /*suppName列取值唯一*/suppCity CHAR(16) NOT NULL, /* suppCity列不允许取空值*/suppPhone VARCHAR(12);,2.列值唯一,【例7.7】定义OrderDetails表,指定quantity的值必须大于1。CREATE TABLE OrderDetails(orderID BIGINT,pdID INT, quantity INT CHECK(quantity1),PRIMARY KEY(orderID,pdID),FOREIGN KEY(orderID) REFERENCES Orders(orderID),FOREIGN K
9、EY(pdID) REFERENCES Product(pdID);,3. 用CHECK短语指定列值应该满足的条件,【例7.8】建立Suppliers表,当suppPhone以“010”开头时,suppCity列的取值必须为“北京”。CREATE TABLE Suppliers(suppID INT PRIMARY KEY, suppName VARCHAR(40) UNIQUE, /*suppName列取值唯一*/suppCity CHAR(16) NOT NULL, /* suppCity列不允许取空值*/suppPhone VARCHAR(12),CHECK(suppCity=北京 AN
10、D suppPhone LIKE 010%) OR suppPhone NOT LIKE 010%);,2. 元组上的约束条件的定义,3 用户定义的完整性检查和违约处理,插入元组或修改属性的值时,RDBMS检查属性上的约束条件是否被满足 如果不满足则操作被拒绝执行,7.1.4 完整性约束命名子句,1 完整性约束命名子句,CONSTRAINT 约束CONSTRAINT PRIMARY KEY短语|FOREIGN KEY短语|CHECK短语,【例7.9】建立Suppliers表,指定suppID列为主码,suppName列取值唯一,suppCity列的取值必须为“北京”、“上海”或“天津”。CRE
11、ATE TABLE Suppliers(suppID INT CONSTRAINT C1 PRIMARY KEY,suppName VARCHAR(40) CONSTRAINT C2 UNIQUE,suppCity CHAR(16) CONSTRAINT C3 CHECK(suppCity IN(北京,上海,天津),suppPhone VARCHAR(12);,删除表中的完整性限制,【例7.10】删除Suppliers表中对suppCity列的限制。ALTER TABLE SuppliersDROP CONSTRAINT C3;,使用ALTER TABLE语句修改表中的完整性限制,修改表中的完
12、整性限制,【例7.11】修改Suppliers表中对suppCity列的限制,改为suppCity列的取值必须为“北京”或“上海”。 可以先删除原来的约束条件,再增加新的约束条件 ALTER TABLE SuppliersDROP CONSTRAINT C3; ALTER TABLE SuppliersADD CONSTRAINT C3 CHECK(suppCity IN(北京,上海);,7.1.5 触发器,触发器,触发器(Trigger)是用户定义在关系表上的一类由事件驱动的特殊过程 由服务器自动激活 可以进行更为复杂的检查和操作,具有更精细和更强大的数据控制能力,1 定义触发器,CREAT
13、E TRIGGER语法格式CREATE TRIGGER ON FOR AS,定义触发器的语法说明,触发器名和表名、视图名必须在同一模式下。触发器名必须符合标识符规则,并且在同一模式下必须唯一。 触发动作体可以是一个PL/SQL过程块,也可以是对已创建存储过程的调用。 创建者:表的拥有者 触发事件:INSERT、DELETE、UPDATE,【例7.12】在订单表(Orders)上建立一个UPDATE触发器,规定订购日期列(orderDate)的值不允许修改。 CREATE TRIGGER Orderdateupdate ON Orders FOR UPDATEAS BEGINIF UPDATE(
14、orderDate)RAISERROR(操作错误,订购日期不允许修改!,10,1) ROLLBACK END,2 删除触发器,删除触发器的SQL语法:DROP TRIGGER 触发器必须是一个已经创建的触发器,并且只能由具有相应权限的用户删除。,【例7.13】删除在订单表上的Orderdateupdate触发器。DROP TRIGGER Orderdateupdate;,7.2 数据库安全性,7.2.1 数据库安全性概述,7.2.2 用户标识和鉴别,系统提供一定的方式让用户标识自己的名字和身份,系统进行核实,通过鉴定后才提供系统使用权。 常用方法:通行字认证数字证书认证智能卡认证个人特征识别,
15、7.2.3 存取控制,对于获得上机权的用户还要根据系统预先定义好的外模式或用户权限进行存取控制,保证用户只能存取他有权存取的数据。 存取控制机制主要包括两部分: 定义用户权限 合法权限检查,DBMS的安全子系统,存取机制的类别,自主存取控制(DAC) 用户对于不同的对象有不同的存取权限;不同的用户对同一对象的存取权限也各不相同;用户可将自己拥有的存取权限转授给其他用户。强制存取控制(MAC) 每一个数据对象被标以一定的密级;每一个用户也被授予某一个级别的许可证;对于任意一个对象,只有具有合法许可证的用户才可以存取。,1 自主存取控制(DAC)方法,用户权限是由两个要素组成的:数据对象和操作类型 定义一个用户的存取权限就是要定义这个用户可以在哪些数据对象上进行哪些类型的操作。 在数据库系统中,定义存取权限称为授权。 DBMS把授权的结果存入数据字典。当用户提出操作请求时,DBMS根据授权定义进行检查,以决定是否执行操作请求。,授权与回收,功能: 把授权的决定告诉系统,由GRANT和REVOKE语句完成 把授权的结果存入数据字典 当用户提出操作请求时,根据授权情况进行检查,以决定是执行操作还是拒绝,GRANT , ON , TO ,WITH GRANT OPTION;,