📖 前言:随着计算机的普及,数据库的使用也越来越广泛。为了适应和满足数据共享的环境和要求,DBMS要对数据库进行保护,保证整个系统的正常运转,防止数据意外丢失、被窃取和不一致数据产生,以及当数据库遭受破坏后能迅速地恢复正常。通常DBMS对数据库的保护是从安全性控制、完整性控制﹑并发控制和数据库的备份与恢复等四个方面实现的,本章主要讲述的是数据库的安全性和完整性控制。



数据库的数据保护主要包括数据库的安全性和完整性保护机制。
问题的提出
数据库的一大特点是数据可以共享,数据共享必然带来数据库的安全性问题
数据库系统中的数据共享不能是无条件的共享
例: 军事秘密、国家机密、新产品实验数据、市场需求分析、疫情流调数据等
数据库中数据的共享是在DBMS统一的严格的控制之下的共享,即只允许有合法使用权限的用户访问允许他存取的数据(举例:数据库的老师不能修改其他课程的成绩)
数据库系统的安全保护措施是否有效是数据库系统主要的性能指标之一
安全性概念:
完整性概念:
为维护数据库的完整性,DBMS必须:
在一般计算机系统中,安全措施是一层一层设置的,下图是常见的计算机系统安全模型。

常用方法:
数据库安全性所关心的主要是DBMS的存取控制机制。存取控制是确保具有授权资格的用户访问数据库的权限,同时使得所有未被授权的人员无法访问数据库的机制。
对于一个数据库,不同的用户有不同的访问要求和使用权限。
一般可以将数据库的用户分为四类:
系统用户(DBA)
数据库对象的属主
一般数据库用户
公共用户
定义用户权限:用户权限是指用户对于数据对象能够执行的操作种类。进行用户权限定义,系统必须提供有关用户定义权限的语言。
合法权限检查:每当用户发出存取数据库的操作请求后,DBMS首先查找数据字典,进行合法权限检查,如果用户的操作请求没有超出其数据操作权限,则准予执行其数据操作;否则,拒绝其执行此操作。
用户权限定义和合法权限机制一起组成了 DBMS 的安全子系统。
自主存取控制☆(Discretionary Access Control ,简称DAC):
强制存取控制(Mandatory Access Control,简称 MAC):
把要保密的数据对无权存取这些数据的用户隐藏起来,对数据提供一定程度的安全保护
例1:允许一个用户查询学生表Student的记录,但是只允许他查询“计算机科学与技术”专业学生的情况。
CREATE VIEW Student_SUBJECT
AS SELECT Sno, Sname, Ssex, Sage, Smajor
FROM Student
WHERE Smajor='计算机科学与技术'
使用视图Student_SUBJECT的用户看到的只是基本表Student的一个“水平子集”,或称行子集。
定义:防止数据库中数据在存储和传输中失密的有效手段
加密的基本思想
加密方法
DBMS中的数据加密(可选的)
跟踪审计(Audit Trial)是一种监视措施,数据库运行中,DBMS跟踪用户对一些敏感数据的存取活动,把用户对数据库的操作自动记录下来放入审计日志(Audit Log)中,有许多DBMS的跟踪审计记录文件与系统的运行日志合在一起。系统能利用这些审计跟踪的信息,重现导致数据库现状的一系列事件。
安全级别
定 义
A1
验证设计 (Verified Design)
B3
安全域(Security Domains)
B2
结构化保护 (Structural Protection)
B1
标记安全保护 (Labeled Security Protection)
C2
受控的存取保护 (Controlled Access Protection)
C1
自主安全保护 (Discretionary Security Protection)
D
最小保护 (Minimal Protection)
跟踪审计的记录一般包括以下内容:
DBMS提供相应的语句供施加和撤销跟踪审计之用
统计数据库
统计数据库中特殊的安全性问题
推断控制方法:
统计数据库的安全问题尚未彻底解决。
SQL Server支持两类登录名:
SQL Server 2014相应地提供了两种身份验证模式:
在SSMS(SQL Server Management Studio 是用于管理SQL Server基础架构的集成环境)中设置身份验证模式

重启SQL Server 的正确方法
有时更改一些操作,提示需要重启SQL Server ,可不是直接关掉再打开,而是如下。
方法①:SQL配置管理器
方法②:控制面板
控制面板->管理工具->服务->找到你的服务器
对于SQL Server数据库服务器,支持两种类型的登录名:


建立这两种登录名也是用两种方法:
建立登录名的实现方法:
CREATE LOGIN login-name
DROP LOGIN login-name
数据库用户一般来自于服务器上已有的登录账户,让登录账户成为数据库用户的操作称为“映射”。一个登录名可以被授权访问多个数据库,但一个登录名在每个数据库中只能映射一次,即一个登录名可对应多个用户,一个用户也可以被多个登录名使用。可以简单的把SQL Server想象成一栋大楼,里面的每个房间都是一个数据库,登录名只是进入大楼的钥匙,而用户名则是进入房间的钥匙,一个登录名可以有多个房间的钥匙,但一个登录名在一个房间只能拥有此房间的一把钥匙。管理数据库用户的过程实际上就是建立登录名与数据库用户之间的映射关系的过程。
数据库用户首先必须是一个有效的登录账户
建立数据库用户的方法
CREATE USER user_name [{FOR | FROM}]
{
LOGIN login_name
}
例2:让SQL_U2登录名成为教学管理信息系统数据库中的用户,且用户名和登录名相同。
USE 教学管理信息系统
CREATE USER SQL_U2;
如果只是创建了一个用户,而没有映射数据库的话,那么仅能访问系统数据库。但无法访问自定义表
❗ 转载请注明出处
作者:HinsCoder
博客链接:🔎 作者博客主页
数据库用户的删除
DROP USER user_name
角色分类:

创建用户定义角色方法
方法一:通过SSMS工具

方法二:通过T-SQL语句
CREATE ROLE role_name [ AUTHORIZATION owner_name ]
注意:sp_addrole、sp_addrolememeber等的使用
同理, 删除角色成员使用的存储过程也是sp_droprolememeber,而删除角色所使用的T-SQL语句为DROP ROLE。
例3:在教学管理信息系统数据库中创建用户定义的角色accounting,并指定dbo为该角色所有者,并为该角色添加用户Jack(假定该用户已存在)。
USE 教学管理信息系统
GO
CREATE ROLE accounting AUTHORIZATION dbo
GO
EXEC sp_addrolemember ‘accounting’, ‘Jack’
例4:删除数据库角色accounting。
USE 教学管理信息系统
GO
EXEC sp_droprolemember 'accounting', 'Jack' /*先删角色成员*/
GO
DROP ROLE accounting
注意:
DROP ROLE删除固定数据库角色。用户使用数据库的方式称为权限。使用数据库的权限分为二类:
访问数据特权:
修改数据库模式的特权:
在SSMS中:
方法一:用SSMS工具实现对权限的管理
(1)授予数据库的权限(修改数据库模式特权)
(2)授予数据库对象上的权限(访问数据库特权)
方法二:用T-SQL语句实现对权限的管理
GRANT {ALL[PRIVILEGES]} ︱权限 [(列 [ , …])] [,…]
[ON 〈数据对象〉] TO〈被授权者〉
[WITH GRANT OPTION] [AS 主体]
例5:在教学管理信息系统数据库中,将表Student的SELECT、DELETE操作权限授予所有的用户。
GRANT SELECT,DELETE ON Student TO PUBLIC;
例6:将表Student的学号、姓名字段的UPDATE权限授予给zhao。
GRANT UPDATE(Sno,Sname)ON Student TO zhao;
例7:将表Student中姓名和年龄的INSERT特权授予zhang,并允许他将此特权转授给其他用户。
GRANT INSERT(Sname,Sage)ON Student TO zhang WITH GRANT OPTION;
例8:【权限综合练习】☆☆☆
假设有用户Jean、Jill和Jack和角色Accounting,用户Jean拥有表Plan_Data(有权限)。逐步进行如下操作:
① 首先创建角色Accounting,并将用户Jill添加成为Accounting的成员。
② Jean将表Plan_Data的 SELECT 权限授予Accounting角色,并允许其成员转授。
③ 用户Jill将表Plan_Data上的SELECT权限授予用户Jack,Jack不是Accounting的成员。
分析:因为对表Plan_Data的SELECT以及转授的权限,是授予Accounting角色而不是显式地授予Jill,所以不能因为已授予 Accounting 角色中成员该权限,而使Jill能够将该权限转授,Jill 必须用 AS 子句来获得 Accounting 角色的转授权限。
实操:
我们首先创建登录名Jill




如上则创建好登录名及用户Jean、Jill和Jack。
/* DBA身份执行 */
CREATE ROLE Accounting;
EXEC sp_addrolemember 'Accounting', 'Jill'; /*第1题*/
/* User Jean 身份执行*/
CREATE TABLE Plan_data /*创建一个测试用的表(完成题目要求)*/
( id char(2) PRIMARY KEY,
name char(8)
)
GRANT SELECT ON Plan_Data TO Accounting WITH GRANT OPTION /*第2题*/
/* User Jill 身份执行 */
GRANT SELECT ON Plan_Data TO Jack AS Accounting /*第3题*/
DENY {ALL[PRIVILEGES]} ︱权限 [(列 [ , …])] [,…]
[ON 〈数据对象〉] TO〈受权者〉
[CASCADE] [AS 主体]
例9:对于用户zhao和zhang,不允许其创建表和视图。
DENY CREATE VIEW,CREATE TABLE TO zhao,zhang;
例10:对于用户li,wang,拒绝其对Course表的增删改的权限。
DENY INSERT,UPDATE,DELETE on Course to li,wang;
例11:对于角色R1的所有角色成员拒绝CREATE RULE权限。
DENY CREATE RULE TO R1;
注意:假设有用户huang是R1的成员,即使显示授予了CREATE RULE权限,仍会拒绝huang的CREATE RULE权限。
当用户将某些权限授给其他用户后,有时还需要把权限收回,回收权限需要使用REVOKE语句。格式如下:
REVOKE [GRANT OPTION FOR]
{ALL[PRIVILEGES]} ︱权限 [(列 [ , …])] [,…]
[ON 〈数据对象〉] TO︱FROM〈受权者〉
[CASCADE] [AS 主体]
例12:收回已授予liu的CREATE TABLE权限。
REVOKE CREATE TABLE FROM liu;
例13:取消以前对zhang用户授予或拒绝的在Student表中姓名和年龄的INSERT特权。
REVOKE INSERT(Sname,Sage)ON Student FROM zhang;
完整性受破坏的常见原因:
为了维护数据库的完整性,数据库管理系统必须提供对完整性约束的支持。
完整性规则是数据库中数据必须满足的语义约束条件,所表达的是给定数据模型中数据以及数据之间联系所具有的制约与依存规则,用以保证数据库状态发生改变时,其数据的正确性、有效性和相容性。在关系模型中,其完整性主要包括实体完整性、参照完整性以及用户自定义的完整性。
SQL标准使用了一系列的概念来描述其完整性;实体完整性一般通过PRIMARY KEY关键字实现,参照完整性一般通过FOREIGN KEY……REFERNCES来实现,而用户自定义的完整性一般可以通过NOT NULL约束、UNIQUE约束、CHECK约束、规则RULE和触发器实现。
对于完整性约束,当对数据库执行INSERT、UPDATE和DELETE语句时,数据库管理系统必须提供一定的机制进行检查,检查这些操作执行后是否会破坏数据库的完整性约束。数据库管理系统若发现有用户进行了违背完整性约束的操作,必须提供一定的处理方法,比如拒绝操作、级联操作等,以保证数据库的完整性,不需要用户编程实现这些语义的约束。
CREATE TABLE中用PRIMARY KEY定义
一个表只能有一个PRIMARY KEY约束
PRIMARY KEY约束可以由几个属性列组成
当为表定义PRIMARY KEY约束时,SQL为主键创建唯一索引,实现主键数据的唯一性,在查询中,该索引可用来对数据进行快速访问。
用PRIMARY KEY约束定义了关系的主码后,每当用户程序对主码列进行更新操作时,系统自动进行完整性检查,凡操作使主码值为空值或使主码值在表中不唯一,系统拒绝此操作,从而保证了实体完整性。
插入或对主码列进行更新操作时,RDBMS按照实体完整性规则自动进行检查。包括:
检查记录中主码值是否唯一可以进行全表扫描,即扫描表中每一条记录的主码值与将插入记录或将修改的新主码值进行比较,判断二者是否相同,但全表扫描是十分耗时的,因此,关系数据库管理系统一般会在所创建的主键上自动建立索引,从而大大提高检查的效率。
CREATE TABLE中用FOREIGN KEY短语定义哪些列为外码REFERENCES短语指明这些外码参照哪些表的主码在SQL中,有两种方法用于说明一个外部关键字:
REFERENCES <表名>(<属性>)
FOREIGN KEY <属性> REFERENCES <表名>(<属性>)
例14:在教学管理信息系统中,创建选课表SC时,除了将Sno和Cno属性组合设置为外码,同时设置Sno与Cno为SC表的外键,其取值分别参照引用Student表的主码和Course表的主码,则有:
CREATE TABLE SC
(Sno CHAR(8) REFERENCES Student(Sno), /*外码定义在列级*/
Cno CHAR(4),
Grade SMALLINT,
PRIMARY KEY(Sno,Cno), /*主码只能定义在表级*/
FOREIGN KEY (Cno) REFERENCES Course(Cno) /*外码定义在表级*/
);
参照完整性检查和违约处理
可能破坏参照完整性的情况及违约处理
被参照表(如Student)
参照表(如SC)
违约处理
可能破坏参照完整性←
←插入元组
拒绝
可能破坏参照完整性←
←修改外码值
拒绝
删除元组→
→可能破坏参照完整性
拒绝/级联删除/设置为空值
修改主码值→
→可能破坏参照完整性
拒绝/级联删除/设置为空值
举例:在Student表中删除学号为“20211025”的学生,由于该学生在SC表有选课记录,可能破坏参照完整性,因此违约处理有拒绝/级联删除(即把两个表的相关记录都删了)/设置为空值(一般不会)
违约处理:
例15:在例14中,创建选课表SC,将Sno和Cno属性组合设置为主码,设置Sno与Cno为SC表的外键,其取值分别参照引用Student表的主码和Course表的主码,同时要求:
(1)当删除Student表中元组时,级联删除SC表中相应的元组;
(2)当更新Student表中的Sno时,级联更新SC表相应的元组;
(3)当删除Course表中的元组造成与SC表不一致时,拒绝删除;
(4)当更新Course表中Cno时,级联更新SC表中相应的元组。
原来的定义:
CREATE TABLE SC
(Sno CHAR(8) ,
Cno CHAR(4),
Grade SMALLINT,
PRIMARY KEY(Sno,Cno), /*主码只能定义在表级*/
FOREIGN KEY (Sno) REFERENCES Student(Sno) /*外码定义在表级*/
FOREIGN KEY (Cno) REFERENCES Course(Cno) /*外码定义在表级*/
);
补充:
CREATE TABLE SC
(Sno CHAR(8) ,
Cno CHAR(4),
Grade SMALLINT,
PRIMARY KEY(Sno,Cno), /*主码只能定义在表级*/
FOREIGN KEY (Sno) REFERENCES Student(Sno) /*外码定义在表级*/
ON DELETE CASCADE /*级联删除SC表中相应的元组*/
ON UPDATE CASCADE, /*级联更新SC表中相应的元组*/
FOREIGN KEY (Cno) REFERENCES Course(Cno) /*外码定义在表级*/
ON DELETE NO ACTION /*当删除Course 表中的元组造成了与SC表不一致时拒绝删除*/
ON UPDATE CASCADE /*当更新Course表中的Cno时,级联更新SC表中相应的元组*/
);
NOT NULL约束、UNIQUE约束以及CHECK约束,元组上的约束可以通过CHECK约束实现。除此之外,还有关系与关系之间的约束可以通过触发器实现,SQL Server 2014中还存在跟CHECK约束功能相似的规则。可在CREATE TABLE时定义
NOT NULL)UNIQUE)CHECK)例16:定义表Student的同时,定义Sname字段的非空性和性别字段的约束条件。
CREATE TABLE Student
(Sno CHAR(8) PRIMARY KEY,
Sname CHAR(8) NOT NULL,
Ssex CHAR(2) CHECK(Ssex IN('男', '女')) default ‘男’, /*默认为男*/
Sage SMALLINT,
Sdeptno CHAR(4) REFERNCES DEPT(Deptno)
)
CREATE TABLE时可以用CHECK短语定义元组上的约束条件,即元组级的限制例17:创建Student表时,添加约束:当学生的性别是男时,其名字不能以Ms.打头。
CREATE TABLE Student
(Sno CHAR(8) PRIMARY KEY,
Sname CHAR(8) NOT NULL,
Ssex CHAR(2) CHECK(Ssex IN(‘男’, ‘女’)) ,
Sage SMALLINT,
Sdeptno CHAR(4) REFERNCES DEPT(Deptno),
CHECK (Ssex='女' OR Sname NOT LIKE 'Ms.%'))
);
CONSTRAINT子句,为约束条件命名,从而更加灵活地增加或删除一个完整性约束。CONSTRAINT <完整性约束条件名称> <完整性约束条件>
其中,完整性约束条件可以为NOT NULL、UNIQUE、CHECK短语、PRIMARY KEY、FOREIGN KEY等。事实上,这里仅仅是通过CONSTRAINT子句为所定义的约束取一个名字。
CREATE TABLE Student
(Sno CHAR(8) CONSTRAINT StudentC1 PRIMARY KEY,
Sname CHAR(8) CONSTRAINT StudentC2 NOT NULL,
Ssex CHAR(2) CONSTRAINT StudentC3 CHECK(Ssex IN(‘男’,’女’)),
Sage SMALLINT,
Sdeptno CHAR(4) CONSTRAINT StudentC4 REFERNCES DEPT(Deptno)
);
ALTER TABLE语句的基本格式分别为:
ALTER TABLE table-name DROP CONSTRAINT <完整性约束条件名称>
ALTER TABLE table-name ADD CONSTRAINT <完整性约束条件名称> <完整性约束条件>
例18:在表Student中,删除外键约束。
ALTER TABLE Student DROP CONSTRAINT StudentC4;
例19:为Student表添加约束,年龄必须在14至45之间。
ALTER TABLE Student ADD CONSTRAINT StudentC5 CHECK(Sage between 14 and 45);
CREATE RULE rule-name
AS condition_expression
说明:
例20:创建一个规则,用以限制插入该规则被绑定到的列中的整数的范围在1000到20000之间。
CREATE RULE range_rule
AS @range>= $1000 AND @range <$20000;
例21:创建一个规则,用于将输入到该规则被绑定到的列中的实际值限制为只能是该规则中列出的值。
CREATE RULE list_rule
AS @list IN (‘1389’, ‘0736’, ‘0877’);
例22:创建一个遵循这种模式的规则:任意两个字符的后面跟一个连字符 (-) 和任意多个字符(或没有字符),并以 0 到 9 之间的整数结尾。
CREATE RULE pattern_rule
AS @value LIKE '__-%[0-9]'
语法格式:
sp_bindrule [ @rulename = ] 'rule-name' ,[ @objname = ] 'object_name’
[ , [ @futureonly = ] 'futureonly_flag' ]
例23:创建一个规则,并绑定到DEPT表的Telephone字段。
CREATE RULE num_rule
AS @num like '[1-3][1-3][1-9] [1-9] [1-9] [1-9] [0-9] [0-9] [0-9] [0-9] [0-9]'
GO
EXEC sp_bindrule 'num_rule', 'DEPT.Telephone'
语法格式为:
sp_unbindrule [ @object_name = ] ' object_name ‘[ , [ @futureonly = ] 'futureonly_flag' ]
例24:取消别名数据类型ssn的规则绑定。
EXEC sp_unbindrule ssn
EXEC sp_unbindrule 'ssn', 'futureonly' /*现有的无影响,只对将来的有效*/
语法格式为:
DROP RULE {rule}[,…n]
例25:解除num_rule规则对象与DEPT表的Telephone的绑定关系,然后删除规则对象num_rule。
EXEC sp_unbindrule DEPT. Telephone
GO
DROP RULE num_rule
AFTER触发器是在执行了INSERT、UPDATE和DELETE语句操作之后执行,只能在表上定义,不能在视图上定义。INSTEAD OF 触发器则代替激活触发器的DML操作执行,即原INSERT、UPDATE和DELETE操作不再执行,由触发器中代码代替其执行。INSTEAD OF 触发器可以定义在表或视图上。注:在Oracle环境下有before触发器
不管是DML触发器还是DDL触发器,创建的语句都是CRAETE TRIGGER语句,两者语法格式略有不同:
CREATE TRIGGER [架构名.]<触发器名> ON <表名|视图名>
[WITH ENCRYPTION] /*说明是否采用加密方式*/
{FOR| AFTER|INSTEAD OF} /*定义触发器的类型*/
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS
{
sql_statement /*T-SQL语句序列*/
}
inserted表(后映象)和deleted表(前映象)。例26:定义一个触发器,当删除课程表COURSE中某一门课程时,在学生选课记录表SC中的相应选课记录也全部被删除。
CREATE TRIGGER Delete_Course ON COURSE
For DELETE /*触发事件是DELETE */
AS
BEGIN
Delete from SC
where Cno in
(select Cno from deleted );
END;

🔎 UPDATE/DELETE 语句与 REFERENCE 约束““冲突解决方案。
例27:定义一个触发器,为教师表TEACHER定义完整性规则“教授的工资不得低于4000元,如果低于4000元,自动改为4000元”。
分析:本题的含义是在TEACHER表上建立触发器,当对该表执行UPDATE或INSERT操作时自动触发该触发器,保证教授的工资大于等于4000。
CREATE TRIGGER Insert_Or_Update_Sal ON TEACHER
For INSERT, UPDATE/*触发事件是插入或更新操作*/AS /*定义触发动作体,是T-SQL过程块*/
begin
update TEACHER
set Sal=4000
where Eno in
(Select Eno from inserted where Job='教授' AND Sal < 4000) ;
End

扩展知识:
语句级触发器,那么执行完该语句后,触发动作只发生一次(SSMS默认)
行级触发器,触发动作将执行N(指定行数)次,SSMS实现需要借助游标(因为默认不支持)。
例28:定义触发器,当教师表TEACHER的工资发生变化后就自动在工资变化表Sal_log中增加一条相应记录,包括被修改记录的用户工号、新工资以及修改人和修改时间。
分析:TEACHER表的工资发生变化,包括向表中插入记录及修改工资列的值。
首先建立工资变化表Sal_log。
CREATE TABLE Sal_log
(Eno VARCHAR(6) REFERENCES TEACHER(Eno),
Sal NUMERIC(7,2),
Username VARCHAR(12),
Date Datetime
);
然后在TEACHER表上建立INSERT和UPDATE触发器,可以分开两个创建,也可以创建一个,这里选择创建两个触发器。
CREATE TRIGGER Insert_Sal ON TEACHER
For INSERT /*触发事件是INSERT*/
AS
DECLARE
@neweno varchar(6),
@newsal numeric(7,2) /*声明局部变量*/
BEGIN
select @neweno=eno,@newsal=sal from inserted;/*给局部变量赋值*/
INSERT INTO Sal_log VALUES(
@neweno,@newsal,CURRENT_USER,CURRENT_TIMESTAMP);
END;
CREATE TRIGGER Update_Sal ON TEACHER
For UPDATE /*触发事件是UPDATE */
AS
DECLARE
@neweno Varchar(6),
@newsal numeric(7,2),
@oldsal numeric(7,2)
BEGIN
select @oldsal=sal from deleted;
select @neweno=eno,@newsal=sal from inserted ;
IF (@newsal <> @oldsal)
BEGIN
INSERT INTO Sal_log VALUES(
@neweno,@newsal,CURRENT_USER,CURRENT_TIMESTAMP);
END;
END;
for,instead of,after 3种触发器的区别
FOR | AFTERINSTEAD OF语法格式:
CREATE TRIGGER trigger_name
ON { ALL SERVER | DATABASE }
[ WITH ENCRYPTION ]
{ FOR | AFTER } { event_type | event_group } [ ,...n ]
AS
{
sql_statement /*T-SQL语句序列*/
}
例29:创建一个DDL触发器,禁止删除当前数据库中的任何表。
CREATE TRIGGER safety
ON DATABASE
AFTER DROP_TABLE
AS
BEGIN
PRINT '不能删除数据库表!'
ROLLBACK TRANSACTION
END
语法如下:
DROP TRIGGER <触发器名>
DISABLE和ENABLE语句使触发器无效或激活触发器,【单选题】 关于约束叙述正确的是( )。
A、每个约束只能作用于一个列上
B、每个约束可以作用多个列,但是必须在一个表里
C、每个约束可以作用到多个表的多个列
D、以上都不对
【单选题】下列( )是对触发器的描述。
A、定义了一个有相关列和行的集合
B、当用户修改数据时,一种特殊形式的存储过程被自动执行
C、SQL语句的预编译集合
D、它根据一或多列的值,提供对数据库表的行的快速访问
【单选题】数据完整性保护中的约束条件主要是指( )。
A、用户操作权限的约束
B、用户口令校对
C、值的约束和结构的约束
D、并发控制的约束
【填空题】数据库完整性的定义一般由SQL语句中的________来实现。它们作为数据库模式的一部分存入________中。
【填空题】关系模型的元组上的约束条件的定义,在___________中用______关键字来实现。
【填空题】在Sno(学号)列上创建约束,要求Sno的值在18至22岁之间,约束名Sno_CK。请写出对应的完整性命名子句_______________。
【填空题】在SQL Server中使用触发器时,有两个比较重要的逻辑表可以存放更新前和更新后的数据,分别是( )表和( )表。
【判断题】SQL Server中的规则在使用时,若已经绑定了相关的数据库对象,则删除该规则时,会自动解绑然后删除。
【简答题】请用SQL语句创建Emp和Dept表,
Emp(Eno, Ename, Eage, Salary, Deptno)
Dept(Deptno, Dname, Phone, Loc)
并存在以下约束。
(1) Dept的主键是Deptno,Emp的主键是Eno。
(2) Emp的外键是Deptno,被参考的关系是Dept。
(3) Emp的 Eage取值在20~60之间,默认值为30。
(4) Dept的Dname值唯一且非空。
(5) Emp的Salary要求必须大于1000。
给定employee,创建该表的语句如下:
CREATE TABLE EMPLOYEE
( Eno Char(8) Primary Key,
Ename Varchar(10),
Eage Smallint
Salary Numeric(7,2),
Deptno Char(4)
);
试用触发器表示下列完整性约束:
(1) 20≤Eage≤60;
(2) Salary≤10000;
(3) 当插入或者修改 一个职工记录的时候,如果工资低于1000元则自动改为1000元。
PS:本题可以创建三个触发器也可以创建一个触发器,建议创建三个触发器完成该题。
答案:1.C 2.B 3.C 4.DDL语句、数据字典 5.CREATE TABLE、CHECK 6.
CONSTRAINT Sno_CK PRIMARY KEY CHECK (Sno between 18 and 22) 7.DELETED、INSERTED 8.×
9.
CREATE TABLE DEPT
( Deptno Char(4) Primary Key,
Dname Varchar(10) unique not null,
Phone Varchar(12),
Loc Varchar(50)
);
CREATE TABLE EMP
( Eno Char(8) Primary Key,
Ename Varchar(10),
Eage Smallint Check(Eage >=20 and Eage<=60) default 30,
Salary Numeric(7,2) check (Salary >1000),
Deptno Char(4) References Dept(Deptno)
);
/*(1)*/
create trigger tri_update_eage_emp on employee
for insert,update
as
declare
@Eage smallint /*声明局部变量*/
begin
select @eage=eage from inserted;
if (@eage<20 or @eage>60)
begin
print('年龄不在合法范围内!')
rollback transaction
end
end
/*(2)*/
create trigger tri_update_salary_emp on employee
for insert,update
as
declare
@salary Numeric(7,2)
begin
select @salary = salary from inserted;
if (@salary >10000)
begin
print('工资取值不在有效范围内!')
rollback transaction
end
end
/*(3)*/
create trigger insert_or_update_emp on employee
for insert,update
as
begin
update emp set salary=1000 where eno in
(Select eno from inserted where salary<1000)
end
OK,以上就是本期知识点“安全性与完整性”的知识啦~~ ,感谢友友们的阅读。后续还会继续更新,欢迎持续关注哟📌~
💫如果有错误❌,欢迎批评指正呀👀~让我们一起相互进步🚀
🎉如果觉得收获满满,可以点点赞👍支持一下哟~
❗ 转载请注明出处
作者:HinsCoder
博客链接:🔎 作者博客主页